多次调用Facebook GraphRequest崩溃应用程序

时间:2016-08-30 07:34:51

标签: android facebook-graph-api

我在GraphRequest适配器的ListView中为Facebook发布评论计数getView()。这是我的代码

public class FeedListAdapter extends BaseAdapter {

    .
    .
    .

    @Override
    public int getCount() {
        return feedItems.size();
    }

    @Override
    public Object getItem(int location) {
        return feedItems.get(location);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        .
        .
        .

        requestComments(feedItems.get(position).getObjectId(), viewHolder.tvPostCommentCount);

    }




    private void requestComments(String objectId, final TextView textViewCommentCount) {

        Bundle parameters = new Bundle();
        parameters.putString("filter", "toplevel");
        parameters.putString("summary", "true");

        new GraphRequest(
                AccessToken.getCurrentAccessToken(),
                "/"+objectId+"/comments?limit=3",
                parameters,
                HttpMethod.GET,
                new GraphRequest.Callback() {
                    public void onCompleted(GraphResponse response) {
                        LOGMSG.SHOW(TAG+"requestComments() -> onCompleted()");

                        try {
                            JSONObject responseJsonObject = response.getJSONObject();
                            LOGMSG.SHOW(TAG+"requestComments() -> responseJsonObject:"+responseJsonObject);
                            JSONObject summaryJsonObject = responseJsonObject.getJSONObject("summary");
                            LOGMSG.SHOW(TAG+"requestComments() -> summaryJsonObject:"+summaryJsonObject);
                            textViewCommentCount.setText(NumberUtils.kFormatter(summaryJsonObject.getLong("total_count")));

                        }catch (Exception e) {
                            e.printStackTrace();
                        }

                    }
                }
        ).executeAsync();
    }


}

随着GraphRequest的号码调用增加,应用程序会因为最大活动线程数而崩溃。

这是Log

   java.util.concurrent.RejectedExecutionException: Task android.os.AsyncTask$3@2581035e rejected from java.util.concurrent.ThreadPoolExecutor@3fa9433f[Running, pool size = 9, active threads = 9, queued tasks = 128, completed tasks = 61]
       at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2011)
       at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:793)
       at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1339)
       at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:594)
       at com.facebook.GraphRequest.executeBatchAsync(GraphRequest.java:1225)
       at com.facebook.GraphRequest.executeBatchAsync(GraphRequest.java:1204)
       at com.facebook.GraphRequest.executeBatchAsync(GraphRequest.java:1187)
       at com.facebook.GraphRequest.executeAsync(GraphRequest.java:998)
       at com.ifahja.adapter.FeedListAdapter.requestLikes(FeedListAdapter.java:345)
       at com.ifahja..adapter.FeedListAdapter.getView(FeedListAdapter.java:227)
       at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:220)
       at android.widget.AbsListView.obtainView(AbsListView.java:2347)
       at android.widget.ListView.measureHeightOfChildren(ListView.java:1270)
       at android.widget.ListView.onMeasure(ListView.java:1182)
       at android.view.View.measure(View.java:17565)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
       at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
       at android.view.View.measure(View.java:17565)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
       at android.view.View.measure(View.java:17565)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
       at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
       at android.view.View.measure(View.java:17565)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
       at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
       at android.view.View.measure(View.java:17565)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
       at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:391)
       at android.view.View.measure(View.java:17565)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
       at android.view.View.measure(View.java:17565)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
       at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
       at android.view.View.measure(View.java:17565)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
       at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2615)
       at android.view.View.measure(View.java:17565)
       at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2045)
       at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1196)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1409)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1084)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5990)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
       at android.view.Choreographer.doCallbacks(Choreographer.java:580)
    at android.view.Choreographe

现在我的问题是如何调用GraphRequst以允许并行线程执行,以避免上述问题。

非常感谢您的回复。

2 个答案:

答案 0 :(得分:0)

我认为你正在以错误的方式实现它。我提供了一个代码plz检查它可能会起作用,因为在我的情况下它可以正常工作。

 FacebookCallback<LoginResult> mCallBack=new FacebookCallback<LoginResult>() {
    @Override
    public void onSuccess(LoginResult loginResult) {


        // Facebook Email address
       GraphRequest request = GraphRequest.newMeRequest(
                loginResult.getAccessToken(),
                new GraphRequest.GraphJSONObjectCallback() {

                    public void onCompleted(
                            JSONObject object,
                            GraphResponse response) {
                        Log.v("LoginActivity Response ", response.toString());

                      try {


                            Name = object.getString("name");
                          Email = object.getString("email");
                          Gender=object.getString("gender");
                          BD=object.getString("link");
              }
                    catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });


        Bundle parameters = new Bundle();
        parameters.putString("fields", "id,name,link,email");
         request.setParameters(parameters);
        request.executeAsync();




    }

当你得到这个项目时,请在listView中使用它们。我希望这对你有所帮助。

答案 1 :(得分:0)

问题在于您要定位的Android平台版本。你想要的是AsyncTasks由串行执行器处理,而不是并行执行器(如现在)。否则,一旦达到线程上限,你仍然会得到RejectedExecutionException。

https://developer.android.com/reference/android/os/AsyncTask.html#SERIAL_EXECUTOR