我在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
以允许并行线程执行,以避免上述问题。
非常感谢您的回复。
答案 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