获取' android.os.NetworkOnMainThreadException'在AsyncTask的doInBackground()中执行GraphRequest.executeAndWait()时

时间:2017-08-25 05:45:22

标签: android facebook-graph-api android-asynctask facebook-android-sdk networkonmainthread

我正在使用Facebook GraphAPI,而我正试图使用​​GraphRequest.executeAndWait()加载来自下一页的结果,如演示here,但应用程序崩溃了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中未处理此类代码时通常会导致此类错误,但此处并非如此。

请让我知道导致此错误的原因以及如何摆脱它。

3 个答案:

答案 0 :(得分:1)

无论哪个线程调用此请求,

public void onCompleted()都在UI线程上运行。因此,如果您想在public void onCompleted()内执行另一个请求,则必须将其包装到另一个AsyncTask或其他异步机制中。

答案 1 :(得分:1)

这不是正确的方法

Vector[Float]

}开始();

您是通过创建新主题来实现的。所有网络操作都应该在已经存在的后台线程中完成,而不是通过创建新线程来完成。

执行此操作的方法是使用处理程序对象在主线程上运行代码。

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();
    }
}

或者您可以在延迟一段时间后使用 postDelayed

进行操作
Handler handler = new Handler();
    handler.post(new Runnable() {
        @Override
        public void run() {
            GraphRequest nextResultsRequests = lastGraphResponse.getRequestForPagedResults(GraphResponse.PagingDirection.NEXT);
            if (nextResultsRequests != null) {
                nextResultsRequests.setCallback(request.getCallback());
                lastGraphResponse = nextResultsRequests.executeAndWait();
            }
        }
    });

答案 2 :(得分:0)

经过一些谷歌搜索,我得到了解决方案。

我只是将GraphRequest.executeAndWait()代码包裹在Thread中,如下所示:

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();