我正在写一个库,它可以进行一些密集的网络工作。所以,我正在使用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();
我的问题是:对主线程有什么影响。在我理想的世界中,我希望在不影响主线程的情况下在单独的线程上运行我的库的操作。如何在没有太大破坏的情况下实现这一目标?
答案 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());