2017-02-16 50 views
0

我想在我創建的服務類中調用此函數形式。我在獲取此功能所需的上下文時遇到了一些問題。據我所知,如果我們正在使用方法getBaseContext()應該執行的服務 中的上下文,但由於某種原因,此方法給了我一個空指針異常。這是我用於文件讀取器方法的代碼。我也會包括這個例外。傳遞服務內部的上下文

我試過的一些東西是關於將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

試試這個'context.openFileInput(fileName);' –

+0

在您傳遞給上下文對象的filereader方法中,爲什麼不使用它,爲什麼要使用getBaseContext()? – Tacolibre

+1

我引用上下文之前,但它不工作,其他人建議在另一篇文章中的一個解決方案是使用getBaseContext(),所以我嘗試使用它。它在任何一個方面都不起作用。 –

回答

4

A服務是一種情境,所以你應該能夠做到:

openFileInput(fileName); 

沒有getBaseContext或getApplicationContext。

如果該類擴展Service。 這至少不會在上下文中拋出NPE。

但它可能是你正在從錯誤的方法讀取文件,例如onBind而不是在構造函數中?

此外,請確保您有該文件的權限,因爲在Android 6.0上,您需要訪問外部文件的權限。

另外,在調用方法時,請確保字符串filename不爲空。

+1

謝謝Joakim,你是對的!在這種情況下,我忘了傳遞正在調用它的活動的上下文。它和傳遞 .getBaseContext()一樣簡單,代碼現在正在工作。因爲這項服務正在從主要活動中調用。乾杯! –

相關問題