繁体   English   中英

如何确定我的android runnable在辅助线程上启动?

[英]How can I be sure that my android runnable started on a worker thread?

我正在尝试学习如何通过使用线程在Android / Java上执行后台任务。 我制作了一个简单的测试应用程序,它纯粹执行了一个新的Thread(new Runnable())并在该runnable内部进行了睡眠。 当它运行时,我仍然能够单击UI上的按钮(我可以看到视觉反馈)。

很高兴这能正常工作,我将相同的代码移到了我的主应用程序代码库中,但是当GUI锁定并且睡眠循环完成后弹出ANR时,它似乎仍在UI线程上运行。

有人可以帮我弄清楚为什么我的backgroundThread没有在Background或Worker线程上运行吗?

LoginService.java

package com.example.services;

import android.app.Activity;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;

public class LoginService implements ILoginService {

private Handler handler;

public LoginService() {
    handler = new Handler(Looper.getMainLooper()){
        @Override
        public void handleMessage(Message msg) {
        // Handle a message from the background task
            Log.d("LoginService","Received a Message");
        }
    };
}

/*
    Check if the username exists in the list
 */
@Override
public boolean isUsernameValid(String username) {
    Log.d("LoginService","Starting Runnable");
    Thread backgroundThread = new Thread(new LoginRunnable(this));

    backgroundThread.run();
    Log.d("LoginService", "Started Runnable");
    return true;
}

/*
    Check if the password is correct for the downloaded user
 */
@Override
public boolean doesPasswordMatch(String password) {
    return false;
}

@Override
public void handleStatus(int i) {
    switch (i) {
        case 1:
            Message newMessage = handler.obtainMessage();
            newMessage.sendToTarget();
            break;
        default:
            break;
    }
}
}

LoginRunnable.java

package com.example.services;

import android.util.Log;

public class LoginRunnable implements Runnable {

public ILoginService loginService;

public LoginRunnable(ILoginService loginService)
{
    this.loginService = loginService;
}

@Override
public void run() {
    // Do the login tasks here
    try {
        for(int i = 0;i<=50;i++) {
            Thread.sleep(200);
            Log.d("LoginRunnable","200ms has passed");
            loginService.handleStatus(1);
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    // Return some completion message to the LoginService.

}
}

应用输出

11-08 18:06:36.757  11722-11722/com.example  D/LoginService﹕ Starting Runnable
11-08 18:06:36.971  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:37.181  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:37.391  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:37.601  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:37.811  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:38.021  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:38.231  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:38.441  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:38.652  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:38.861  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:39.072  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:39.282  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:39.492  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:39.701  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:39.912  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:40.121  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:40.332  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:40.542  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:40.752  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:40.962  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:41.172  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:41.381  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:41.592  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:41.802  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:42.012  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:42.222  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:42.432  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:42.642  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:42.851  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:43.062  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:43.272  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:43.482  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:43.692  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:43.902  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:44.112  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:44.322  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:44.532  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:44.741  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:44.952  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:45.162  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:45.372  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:45.582  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:45.792  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:46.002  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:46.212  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:46.422  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:46.632  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:46.842  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:47.052  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:47.262  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:47.472  11722-11722/com.example  D/LoginRunnable﹕ 200ms has passed
11-08 18:06:47.472  11722-11722/com.example  D/LoginService﹕ Started Runnable
11-08 18:06:47.482  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.482  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.483  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.483  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.483  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.483  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.483  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.483  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.483  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.483  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.483  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.484  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.484  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.484  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.484  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.484  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.484  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.484  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.484  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.484  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.484  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.484  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.484  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.485  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.485  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.485  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.485  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.485  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.485  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.485  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.485  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.485  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.485  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.485  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.485  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.485  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.486  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.486  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.486  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.486  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.486  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.486  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.486  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.486  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.486  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.486  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.486  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.486  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.487  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.487  11722-11722/com.example  D/LoginService﹕ Received a Message
11-08 18:06:47.487  11722-11722/com.example  D/LoginService﹕ Received a Message

工作测试程序(独立项目)的输出

11-08 17:57:31.284  32596-32610/com.subarudev.threadingtest D/SleepRunnable﹕ Sleeping on thread
11-08 17:57:31.284  32596-32596/com.subarudev.threadingtest D/MainActivity﹕ Handle Message
11-08 17:57:31.493  32596-32610/com.subarudev.threadingtest D/SleepRunnable﹕ Sleeping on thread
11-08 17:57:31.494  32596-32596/com.subarudev.threadingtest D/MainActivity﹕ Handle Message
11-08 17:57:31.704  32596-32610/com.subarudev.threadingtest D/SleepRunnable﹕ Sleeping on thread
11-08 17:57:31.704  32596-32596/com.subarudev.threadingtest D/MainActivity﹕ Handle Message
11-08 17:57:31.914  32596-32610/com.subarudev.threadingtest D/SleepRunnable﹕ Sleeping on thread
11-08 17:57:31.914  32596-32596/com.subarudev.threadingtest D/MainActivity﹕ Handle Message
11-08 17:57:32.123  32596-32610/com.subarudev.threadingtest D/SleepRunnable﹕ Sleeping on thread
11-08 17:57:32.124  32596-32596/com.subarudev.threadingtest D/MainActivity﹕ Handle Message
11-08 17:57:32.334  32596-32610/com.subarudev.threadingtest D/SleepRunnable﹕ Sleeping on thread
11-08 17:57:32.334  32596-32596/com.subarudev.threadingtest D/MainActivity﹕ Handle Message

backgroundThread.run()-> backgroundThread.start()?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM