使用方法 get 时从服务获取空对象引用

Getting a null object reference from Service when use method get

我想在后台加载来自 VK API 的一些数据,为此,我创建了自己的服务 "VKNotifications" 并设置线程 getNews:

Thread getNews = new Thread(new Runnable() {
    public void run() {
        Log.d("BTCR", "Starting Thread getNews");
        while (true) {
            Log.d("BTCR", "THREAD getNews");
            try {
                sleep(2000);
                vkNews.get(1, 8);
                Log.d("BTCR", "Getting news from source");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
});

我创建 vkNews 对象并从服务 onCreate 启动线程:

@Override
public void onCreate() {
    super.onCreate();
    Log.d("BTCR", "Start service VKNotifications");

    vkNews = new VKNews(this);
    getNews.start();
}

然后我从 AuthorizedActivity onCreate 启动服务:

startService(new Intent(AuthorizedActivity.this, VKNotifications.class)); 

并得到这个错误:

07-09 02:36:03.651  14239-14257/id.mirgorod.btcrussia:VKNotifications E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-217
Process: id.mirgorod.btcrussia:VKNotifications, PID: 14239
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
at com.vk.sdk.api.VKRequest.getLang(VKRequest.java:550)
at com.vk.sdk.api.VKRequest.getPreparedParameters(VKRequest.java:274)
at com.vk.sdk.api.httpClient.VKHttpClient.requestWithVkRequest(VKHttpClient.java:127)
at com.vk.sdk.api.VKRequest.getPreparedRequest(VKRequest.java:297)
at com.vk.sdk.api.VKRequest.getOperation(VKRequest.java:315)
at com.vk.sdk.api.VKRequest.start(VKRequest.java:376)
at com.vk.sdk.api.VKRequest.executeWithListener(VKRequest.java:234)
at id.mirgorod.btcrussia.VKNews.get(VKNews.java:46)
at id.mirgorod.btcrussia.VKNotifications.run(VKNotifications.java:36)
at java.lang.Thread.run(Thread.java:818)
07-09 02:36:03.667  14239-14255/id.mirgorod.btcrussia:VKNotifications D/

这是我的VKNews对象代码,获取方法:

public void get(int offset, int count){
    final JSONArray returnArray = new JSONArray();
    VKRequest request = VKApi.wall().get(VKParameters.from("domain", "bitcoin", VKApiConst.OFFSET, offset, VKApiConst.COUNT, count));
    request.executeWithListener(new VKRequest.VKRequestListener() {
        @Override
        public void onError(VKError error) {
            System.out.println("error:  " + error);
        }

        @Override
        public void onComplete(VKResponse response) {
            super.onComplete(response);
            try {
                json = response.json.getJSONObject("response").getJSONArray("items");
                for (int i = 0; i < json.length(); i++) {
                    returnArray.put(json.getJSONObject(i).get("id").toString());
                }
                gettedID = returnArray;
                Log.d("BTCR", "gettedID: " + returnArray.toString());
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void attemptFailed(VKRequest request, int attemptNumber, int totalAttempts) {
            //I don't really believe in progress
        }
    });
}

如果我 运行 从 AuthorizedActivity 线程获取新闻,它工作完美,但如果我 运行 从服务获取它,我得到错误。我做错了什么?

您需要设置应用上下文。 API 似乎始终使用上下文。

https://github.com/VKCOM/vk-android-sdk/blob/master/vksdk_library/src/main/java/com/vk/sdk/VKUIHelper.java

VKUIHelper.setApplicationContext(this);