与线程混淆 - 处理程序阻止UI线程

Sve*_*ver 1 multithreading android

我有一个耗时的任务(迭代文件并将其内容发送到服务器)我想在后台线程中执行,在特定的interwal中(这就是我想使用Handler的原因).

从UI线程我有这样的调用:

LogsManager lm;
lm = new LogsManager(this);
lm.processLogFiles();
Run Code Online (Sandbox Code Playgroud)

LogsManager课堂上我有以下代码:

public void processLogFiles(){
    Handler mHandler = new Handler();
    mHandler.postDelayed(logsRunable, 1000);    
}

private Runnable logsRunable = new Runnable() {
        @Override
        public void run() {
            File f = new File(Environment.getExternalStorageDirectory()+Constants.LOG_DIR);             
            File[] logFiles = f.listFiles();
            for (int i = 0; i < logFiles.length; i++) {
                readLogs(logFiles[i]); // executes some other methods inside
            }
        }
    };
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,这只是Handler调用方法Runnable.不幸的是,它也阻止了我的UI线程.是不是Handler应该开始一个新线程Runnable?我也在我的应用程序的其他部分使用处理程序,它们工作得很好.我做错了吗?

den*_*nko 10

文档所述,Handler:

创建新的Handler时,它将绑定到创建它的线程的线程/消息队列

因此,如果您mHandler在UI线程中创建,那么它将在UI线程中运行任务 - 因此问题.