use*_*869 9 java multithreading android android-asynctask firebase
我的应用程序上一直出现错误,I/Choreographer: Skipped 252 frames! The application may be doing too much work on its main thread.
我认为这会导致我的UI出现一些我不想要的延迟.我认为这是因为当我执行Firebase查询时,当我这样做时onDataChange()
,它似乎总是在主UI线程中执行.我有大约5个类似于以下内容的Firebase查询.其结果是,我试图从移动我的代码onDataChange()
的方法来将AsyncTask
和更新UI线程onPostExecute()
的方法AsyncTask
.但是,当我尝试这个时,该onPostExecute()
方法永远不会完成.这是我的尝试:
public void getPublicPosts(final View progressOverlay, final View fragmentView, final Context context) {
//Need to do order by / equal to.
Firebase postsRef = firebaseRef.child("Posts");
Query query = postsRef.orderByChild("privacy").equalTo("Public");
query.keepSynced(true);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (final DataSnapshot postSnapShot : dataSnapshot.getChildren()) {
AsyncTask task = new AsyncTask<URL, Integer, Long>() {
@Override
protected Long doInBackground(URL... params) {
Post post = postSnapShot.getValue(Post.class);
List<Post> publicPosts = application.getPublicAdapter().getPosts();
if (post.getPrivacy().equals("Public") && application.getPublicAdapter().containsId(publicPosts, post.getId()) == null) {
application.getPublicAdapter().getPosts().add(0, post);
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress) {
}
@Override
protected void onPostExecute(Long result) {
System.out.println("Finished executing public");
populateNewsFeedList(fragmentView, application.getPublicAdapter(), TabEnum.Public, context);
if (progressOverlay.getVisibility() == View.VISIBLE) {
System.out.println("getPublicPosts: DONE");
AndroidUtils.animateView(progressOverlay, View.GONE, 0, 200);
fragmentView.findViewById(R.id.rv_public_feed).setVisibility(View.VISIBLE);
}
}
};
`task.execute();`
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
Run Code Online (Sandbox Code Playgroud)
任何帮助都会有所帮助.如果有人能帮助我,这将是伟大的.谢谢!
编辑:添加功能来创建 AsyncTask
public AsyncTask asyncTaskWrapper(final DataSnapshot dataSnapshot, final View progressOverlay, final View fragmentView, final Context context) {
AsyncTask task = new AsyncTask<URL, Integer, Long>() {
@Override
protected Long doInBackground(URL... params) {
for (final DataSnapshot postSnapShot : dataSnapshot.getChildren()) {
Post post = postSnapShot.getValue(Post.class);
List<Post> publicPosts = application.getPublicAdapter().getPosts();
if (post.getPrivacy() == PrivacyEnum.Public && application.getPublicAdapter().containsId(publicPosts, post.getId()) == null) {
application.getPublicAdapter().getPosts().add(0, post);
}
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress) {
}
@Override
protected void onPostExecute(Long result) {
System.out.println("Finished executing public");
TabsUtil.populateNewsFeedList(fragmentView, application.getPublicAdapter(), TabEnum.Public, context);
if (progressOverlay.getVisibility() == View.VISIBLE) {
System.out.println("getPublicPosts: GONE");
AndroidUtils.animateView(progressOverlay, View.GONE, 0, 200);
fragmentView.findViewById(R.id.rv_public_feed).setVisibility(View.VISIBLE);
}
}
};
return task;
}
Run Code Online (Sandbox Code Playgroud)
PublicPosts功能:
public void getPublicPosts(final View progressOverlay, final View fragmentView, final Context context) {
//Need to do order by / equal to.
Firebase postsRef = firebaseRef.child("Posts");
Query query = postsRef.orderByChild("privacy").equalTo(PrivacyEnum.Public.toString());
query.keepSynced(true);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
asyncTaskWrapper(dataSnapshot, progressOverlay, fragmentView, context);
}
@Override
public void onCancelled(FirebaseError firebaseError) {
TabsUtil.populateNewsFeedList(fragmentView, application.getPublicAdapter(), TabEnum.Public, context);
}
});
}
Run Code Online (Sandbox Code Playgroud)
您没有在您创建的 AsyncTask 上调用execute(),因此它永远不会被触发。
创建 AsyncTask 后,对其调用execute(URL...params),以便它将被执行。
我还发现您没有使用您传递的参数,因此您可以不传递任何内容,它就会起作用。
归档时间: |
|
查看次数: |
1562 次 |
最近记录: |