2017-02-16 1 views
0

내가 만든 서비스 클래스에서이 함수를 호출하려고합니다. 이 함수를 작동시키는 데 필요한 컨텍스트와 관련된 몇 가지 문제가 있습니다. 우리가 알고있는 바로는 이라는 서비스 내에서 getBaseContext() 메서드를 사용해야한다는 문맥으로 작업하고 있지만 어떤 이유로이 메서드는 null 포인터 예외를 제공합니다. 이것은 파일 판독기 메서드에 사용하고있는 코드입니다. 나는 예외도 포함 할 것이다.서비스 내에서 컨텍스트 전달

내가 시도한 것들 중 일부는 getBaseContext()에서 getApplicationContext()으로 변경되지만 아무런 결과가 나오지 않습니다. 서비스 내부에서 컨텍스트를 조작하려면 어떻게해야합니까?

파일 판독기 번호 :

public String fileReader(Context context, String fileName) throws IOException, JSONException { 
     FileInputStream fis = getBaseContext().openFileInput(fileName); 
     InputStreamReader isr = new InputStreamReader(fis); 
     BufferedReader streamReader = new BufferedReader(isr); 

     StringBuilder responseStrBuilder = new StringBuilder(); 

     String inputString; 
     while((inputString = streamReader.readLine()) != null) { 
      responseStrBuilder.append(inputString); 
     } 
     streamReader.close(); 
     isr.close(); 
     fis.close(); 


     return responseStrBuilder.toString(); 


    } 

예외 : 사이드 참고로

W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.FileInputStream android.content.Context.openFileInput(java.lang.String)' on a null object reference 
W/System.err:  at com.example.allwaystrack01.internalhtml_chat_demo.services.SystemWebService.fileReader(SystemWebService.java:115) 
W/System.err:  at com.example.allwaystrack01.internalhtml_chat_demo.services.SystemWebService$WebAppInterface.returnContent(SystemWebService.java:176) 
W/System.err:  at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method) 
W/System.err:  at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:39) 
W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
W/System.err:  at android.os.Looper.loop(Looper.java:154) 
W/System.err:  at android.os.HandlerThread.run(HandlerThread.java:61) 

,이 방법은 실제 활동에서 호출 될 때 작동한다. 그러나 서비스에서 아닙니다. 이것의 뒤에 어떤 특정한 추론?

나는 포인터를 고맙게 생각합니다.

+1

contextread 개체에서 전달하는 filereader 메서드에서 this'context.openFileInput (fileName); ' –

+0

을 시도하십시오. 사용하지 않는 이유는 무엇입니까? getBaseContext()를 사용하는 이유는 무엇입니까? – Tacolibre

+1

이전에 컨텍스트를 참조했으나 작동하지 않았습니다. 다른 포스트에서 다른 게시물에 제안한 한 가지 해결책은 getBaseContext()를 사용하는 것이 었습니다. 어느 쪽이든 작동하지 않습니다. –

답변

4

서비스는 상황이다, 그래서 당신은 할 수 있어야 다음 getBaseContext 또는 getApplicationContext없이

openFileInput(fileName); 

.

클래스가 Service를 확장하는 경우. 적어도 문맥에 NPE를 던지지는 않을 것입니다.

하지만 잘못된 메서드에서 파일을 읽는 것일 수 있습니다 (예 : onBind 및 생성자가 아닌 경우)?

또한 Android 6.0에서 외부 파일에 액세스 할 수있는 권한이 필요하므로 읽으려는 파일에 대한 권한이 있는지 확인하십시오.

또한 메소드를 호출 할 때 filename 파일 이름이 null이 아닌지 확인하십시오.

+1

Joakim, 고맙습니다! 이 경우 나는 이것을 부르는 활동의 맥락을 전달하는 것을 잊었다. .getBaseContext()를 전달하는 것만 큼 간단하며 코드가 작동합니다. 이 서비스는 주 활동에서 호출되기 때문입니다. 건배! –