作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的疑问是关于如何在我的服务的 API 中的另一个线程上运行一段代码。
我的服务中有一个 API 函数。这个 API 的代码只有一部分是独立的(2-3 LOC),我想将它移到单独的线程中,因为这些代码占用了大量时间,而且这些代码行目前对 UI 线程没有影响。这就是我所做的。
原始代码:
func(){
subA();
subB();
subC();
}
修改后的代码:
Thread mThread = null;
func(){
subA();
if(mThread == null){
mThread = new Thread(){
public void run(){
subB();
subC();
}
}
}
mThread.start();
}
在运行这段代码时,我得到了一个关于“thread already started”的异常。
我确实在 SO 上读到过,已经启动的线程不能再次重新启动。我需要再次创建一个新线程并启动它。但我不想每次都创建一个新的线程对象,因为这会导致 UI 线程的性能问题。有没有其他方法可以处理这个问题。
我发现了其他几种在 android 中实现此目的的方法,例如 Handler、HandlerThread、AsyncTask 等。但我无法确定哪种方法最适合在这里使用(我不想创建新的每次对象(thread/asynctask/handler/handlerthread
),只需要创建一次线程对象并每次都重新使用它。
如果有人以前在这方面工作过,请帮忙!
最佳答案
在进一步研究线程部分时,我设法发现使用 ThreadHandler 比使用线程 + 循环器更简单(因为 ThreadHandler 默认附加了一个循环器,并且管理得很好)。所以,这就是我现在正在寻找的代码。
HandlerThread mThread = null;
Handler mHandler = null;
func(){
subA();
if(mThread == null){
mThread = new HandlerThread("mThread");
mThread.start();
mHandler = new Handler(mThread.getLooper());
}
mHandler.post(new Runnable(){
public void run(){
subB();
subC();
}});
}
但是我发现这段代码有一个问题,我仍然需要在每次调用 func() 时创建一个新的可运行对象。需要找出如何避免这种情况。
关于android - 在单独的线程上运行一段代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21451909/
我是一名优秀的程序员,十分优秀!