在服务中传递上下文

时间:2017-02-16 18:55:57

标签: java android

我试图在我创建的服务类中调用此函数表单。我遇到了使这个功能工作所需的上下文的一些问题。据我所知,如果我们在内部使用上下文 方法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 个答案:

答案 0 :(得分:4)

服务是一种上下文,所以你应该能够:

openFileInput(fileName);

没有getBaseContext或getApplicationContext。

如果课程扩展了服务。 这至少不会在上下文中引入NPE。

但是你可能是从错误的方法读取文件,例如onBind而不是构造函数?

此外,请确保您具有您尝试阅读的该文件的权限,因为在Android 6.0上您需要获得访问外部文件的权限。

此外,请确保在调用方法时字符串filename不为null。