Android主线程Looper关注

时间:2013-09-12 16:58:20

标签: java android multithreading thread-safety looper

我正在写一个库,它可以进行一些密集的网络工作。所以,我正在使用HandlerThread来执行这样的操作:

Looper.prepare();
libraryThread = new LibraryHandlerThread(context);
libraryThread.start();
libraryThread.getLooper();

LibraryHandlerThread执行网络操作和其他耗时的操作。

当我从工作线程(除主线程以外的任何线程)调用此代码时,它工作正常。但抱怨“当一个人已经活跃时,不能初始化另一个活跃者”。我相信Looper默认运行在主线程上,并抱怨Looper.prepare()。我可以执行类似以下的操作,使其在主线程中运行:

Looper.getMainLooper().quit();
Looper.prepare();
libraryThread = new LibraryHandlerThread(context);
libraryThread.start();
libraryThread.getLooper();

我的问题是:对主线程有什么影响。在我理想的世界中,我希望在不影响主线程的情况下在单独的线程上运行我的库的操作。如何在没有太大破坏的情况下实现这一目标?

2 个答案:

答案 0 :(得分:0)

你想要研究的是使用Asynctask在后台运行它,这将允许你的主线程继续工作http://developer.android.com/reference/android/os/AsyncTask.html

或者,如果这是您需要不断运行的内容,则可以创建服务。 http://developer.android.com/reference/android/app/Service.html

答案 1 :(得分:0)

请尝试以下代码:

private static final HandlerThread sWorkerThread = new HandlerThread("network-operations");
static {
    sWorkerThread.start();
}
private static final Handler sWorker = new Handler(sWorkerThread.getLooper());