gpt4 book ai didi

android - 在单独的线程上运行一段代码

转载 作者:搜寻专家 更新时间:2023-11-01 08:00:50 25 4
gpt4 key购买 nike

我的疑问是关于如何在我的服务的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com