gpt4 book ai didi

java - Android 在新线程中运行类中的函数

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:56 24 4
gpt4 key购买 nike

我有这个代码:

MyClass tmp = new MyClass();
tmp.setParam1(1);
tmp.SetParam2("Test");
tmp.setParam3("Test");
...

然后我有

tmp.heavyCalc();

在这个繁重的计算操作中,我必须更新 UI 中的进度条,并向用户展示它正在处理进度条更新和一些要显示的文本。现在它不起作用,因为我没有使用线程,应用程序卡住并挂起,然后突然返回进度条为 100% 并且所有文本一起突然出现。

所以我决定让我的函数作为新线程运行。在我的类定义中,我添加了 implements Runnable所以

public class MyClass implements Runnable{

然后我将那个 heavyCalc() 函数称为我创建的新 Run() 函数:

@Override
public void Run()
{
heavyCalc();
}

现在我这样做:

Thread thread = new Thread(tmp);
tmp.run();

它有效,但 UI 仍然没有任何变化,应用程序卡住,然后进度条突然 100%,应用程序返回。我缺少什么?

最佳答案

您的答案:正如其他答案所建议的那样,您应该使用 thread.start() 而不是 tmp.run()

以下描述与您的问题没有直接关系,但它可以帮助您编写更好的代码,并保护您免受将来会遇到的错误。

但为了编写更好的代码,我的建议是使用处理程序。通过使用处理程序,您可以在 主线程 中执行您的操作。

例如:要从您为其他目的创建的类更新 textView 的值,您必须将此操作(更新 textView)发布到主线程,因为您的自定义线程没有操作 View 的权限。

在您的项目中使用处理程序:

1.您应该在主线程中从 Handler 类创建一个实例:

public static Handler handler = new Handler();

2.从第二个线程开始,像这样使用该处理程序:

YourMainThreadClass.handler.post(new Runnable() {
@Override
public void run() {
// Do Whatever
}
});

异常(exception):您不必为 progressBar 使用处理程序,但您应该使用处理程序来处理相同问题中的其他 View 。 ProgressBar 只是一个异常(exception),但我建议您在这种情况下也使用处理程序。

关于java - Android 在新线程中运行类中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23876775/

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