在AsyncTask的doInBackground()中执行GraphRequest.executeAndWait()时获取"android.os.NetworkOnMainThreadException" [英] Getting 'android.os.NetworkOnMainThreadException' while performing GraphRequest.executeAndWait() in doInBackground() of AsyncTask
问题描述
我正在使用Facebook GraphAPI,并且尝试使用GraphRequest.executeAndWait()
从下一页加载结果,如此处,但应用程序崩溃了,提示android.os.NetworkOnMainThreadException
.
I'm using Facebook GraphAPI and I'm trying to load results from next page using GraphRequest.executeAndWait()
as demonstrated here, but the app is crashing giving android.os.NetworkOnMainThreadException
.
这是我的代码:
class RetrieveF extends AsyncTask<Void, Integer, String> {
GraphRequest request;
protected String doInBackground(Void...args0) {
new GraphRequest(
AccessToken.getCurrentAccessToken(), "/me/friends", null, HttpMethod.GET,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
JSONObject innerJson = response.getJSONObject();
try {
JSONArray data = innerJson.getJSONArray("data");
for (int i = 0; i<data.length(); i++){
String id = data.getJSONObject(i).getString("id");
request = new GraphRequest(AccessToken.getCurrentAccessToken(), id+"/feed", null, HttpMethod.GET,
new GraphRequest.Callback() {
@Override
public void onCompleted(GraphResponse response) {
JSONObject innerJson = response.getJSONObject();
try {
JSONArray data = innerJson.getJSONArray("data");
for (int i = 0; i<data.length(); i++) {
JSONObject obj = data.getJSONObject(i);}
} catch (JSONException e) {
Log.d("innerFacebookException", e.getMessage());
}
GraphRequest nextResultsRequests = response.getRequestForPagedResults(GraphResponse.PagingDirection.NEXT);
if (nextResultsRequests != null) {
nextResultsRequests.setCallback(request.getCallback());
// error on this line
response = nextResultsRequests.executeAndWait();
//
}
}
}
);
request.executeAsync();
}
} catch (JSONException e) {
Log.d("facebookException", e.getMessage());
}
}
}
).executeAsync();
return "success";
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
}
这是堆栈跟踪:
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
at com.android.org.conscrypt.OpenSSLSocketImpl.shutdownAndFreeSslNative(OpenSSLSocketImpl.java:1131)
at com.android.org.conscrypt.OpenSSLSocketImpl.close(OpenSSLSocketImpl.java:1126)
at com.android.okhttp.Connection.closeIfOwnedBy(Connection.java:132)
at com.android.okhttp.OkHttpClient$1.closeIfOwnedBy(OkHttpClient.java:75)
at com.android.okhttp.internal.http.HttpConnection.closeIfOwnedBy(HttpConnection.java:137)
at com.android.okhttp.internal.http.HttpTransport.disconnect(HttpTransport.java:135)
at com.android.okhttp.internal.http.HttpEngine.disconnect(HttpEngine.java:578)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.disconnect(HttpURLConnectionImpl.java:122)
at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.disconnect(DelegatingHttpsURLConnection.java:93)
at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.disconnect(HttpsURLConnectionImpl.java)
at com.facebook.internal.Utility.disconnectQuietly(Utility.java:416)
at com.facebook.GraphRequest.executeConnectionAndWait(GraphRequest.java:1272)
at com.facebook.GraphRequest.executeBatchAndWait(GraphRequest.java:1168)
at com.facebook.GraphRequest.executeBatchAndWait(GraphRequest.java:1134)
at com.facebook.GraphRequest.executeBatchAndWait(GraphRequest.java:1118)
at com.facebook.GraphRequest.executeAndWait(GraphRequest.java:1093)
at com.facebook.GraphRequest.executeAndWait(GraphRequest.java:987)
at com.qbc.xxx.MainActivity$RetrieveFacebookPosts$1$1.onCompleted(MainActivity.java:398)
at com.facebook.GraphRequest$5.run(GraphRequest.java:1383)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我无法弄清楚是什么原因导致此错误,因为此类错误通常是在AsyncTask
中未处理此类代码时引起的,但在这里情况并非如此.
I'm unable to figure out what's causing this error as such errors are usually caused when this sort of code is not handled in AsyncTask
but that is not the case here.
请让我知道导致此错误的原因以及如何消除此错误.
Please let me know what's causing this error and how to get rid of it.
推荐答案
经过几次Google搜索,我找到了解决方案.
After a few google searches I got the solution.
我只是将GraphRequest.executeAndWait()
代码包装在Thread
中,如下所示:
I just wrapped the GraphRequest.executeAndWait()
code in a Thread
like this:
Thread t = new Thread() {
@Override
public void run() {
GraphRequest nextResultsRequests = lastGraphResponse.getRequestForPagedResults(GraphResponse.PagingDirection.NEXT);
if (nextResultsRequests != null) {
nextResultsRequests.setCallback(request.getCallback());
lastGraphResponse = nextResultsRequests.executeAndWait();
}
}
};
t.start();
这篇关于在AsyncTask的doInBackground()中执行GraphRequest.executeAndWait()时获取"android.os.NetworkOnMainThreadException"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!