使用方法 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 似乎始终使用上下文。
VKUIHelper.setApplicationContext(this);
我想在后台加载来自 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 似乎始终使用上下文。
VKUIHelper.setApplicationContext(this);