应用程序显示在主线程中执行了太多工作,即使操作是在后台线程中执行的

时间:2016-04-19 12:28:18

标签: android multithreading performance android-asynctask worker-thread

您好我每次执行查询时都会在日志中收到此消息。但是查询仅在后台线程中执行,而Table不再有500行,而且我总是应用限制100。 请不要简单地给出一些链接,并说这个问题已经回答了。

我已经在SO中阅读了很多关于此问题的答案。但它仍然没有解决我的问题。任何人都可以给我正确的理由或解决我的问题吗?

编舞:跳过98帧!应用程序可能在其主线程上做了太多工作。

以下是我的runnable类,我将其称为新线程(新的MessageLoaderThread(限制))。start();

private class MessageLoaderThread implements Runnable {

        int limit;
        ArrayList<MESSAGE_HEADER> result;

        public MessageLoaderThread(int limit) {
            this.limit = limit;
        }

        @Override
        public void run() {

            showProgressRing(true);

           result = Helper.getRows("Select * from TABLE_NAME LIMIT "+limit);

                    if (result != null) {
                        int count = result.size();

                        if (count > 0) {
                            firstVisibleMessageSeqId = result.get(0).getsequenceId();
                            lastVisibleMessageSeqId = result.get(count - 1).getsequenceId();
                        }
                    }

            if (result != null && result.size() > 0) {
                updateAdapter(result);
            }
            showProgressRing(false);
        }
    }

由于

2 个答案:

答案 0 :(得分:0)

我知道你已经阅读了很多问题。您是否尝试过使用AsyncTask?它是Android中多线程的默认设置。

尝试不更新线程内的适配器。当您更改某些视图时,Android会执行一些动画。等待线程完成,然后更新您的视图。

答案 1 :(得分:0)

如果在使用AsyncTask后仍然收到警告,可能是因为操作仍然很重且长时间运行。请按照java.util.concurrent documentation

中的建议,尝试使用AsyncTask中的其他api
  

AsyncTask旨在成为Thread和Handler的辅助类   并不构成通用的线程框架。 AsyncTasks   理想情况下应该用于短期操作(几秒钟的时间)   大多数。)如果你需要保持线程长时间运行,   强烈建议您使用提供的各种API   java.util.concurrent包,如Executor,ThreadPoolExecutor和   FutureTask。