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
.
Here's my code:
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);
}
}
Here's the stacktrace:
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)
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.
After a few google searches I got the solution.
I just wrapped the
GraphRequest.executeAndWait()
code in aThread
like this: