2017-02-16 16 views
0

私が作成したサービスクラス内でこの関数フォームを呼び出そうとしています。この関数を動作させるために必要なコンテキストに関するいくつかの問題があります。私が知っているところでは、 というサービスのコンテキストで作業しているのですが、何らかの理由でこのメソッドが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

コンテキスト・オブジェクトで渡しているfilereaderメソッドのthis.context.openFileInput(fileName); ' –

+0

を試してみてくださいなぜそれを使用していないのですが、なぜgetBaseContext()を使用しますか? – Tacolibre

+1

私は前にコンテキストを参照しましたが、動作しませんでした。他の投稿で提案された解決策の1つはgetBaseContext()を使用することでした。どちらの方法でも動作しません。 –

答えて

4

Aサービスは、コンテキストであるので、あなたが行うことができる必要があります:getBaseContextまたはgetApplicationContextなし

openFileInput(fileName); 

クラスがServiceを拡張する場合。 これは少なくとも、コンテキスト上でNPEを投げることはありません。

しかし、あなたは間違ったメソッドからファイルを読み込んでいる可能性があります。たとえば、onBindのように、コンストラクタではありません。

また、Android 6.0では外部ファイルへのアクセス権が必要なため、そのファイルの読み取り権を持っていることを確認してください。

また、メソッドを呼び出すときにfilenameの文字列がnullでないことを確認してください。

+1

ありがとうJoakim、あなたは正しいです!この場合、私はこれを呼んでいた活動の文脈を渡すのを忘れていました。これは .getBaseContext()を渡すのと同じくらい簡単で、コードは現在動作しています。このサービスは主なアクティビティから呼び出されているためです。乾杯! –

関連する問題