由于异步Firebase调用,主线程做了太多工作?

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)

Tri*_*tan 1

您没有在您创建的 AsyncTask 上调用execute(),因此它永远不会被触发。

创建 AsyncTask 后,对其调用execute(URL...params),以便它将被执行。

我还发现您没有使用您传递的参数,因此您可以不传递任何内容,它就会起作用。