使用java线程的android
我正在尝试创建一个简单的线程,它从一个按钮开始,但出现了一些问题。 代码如下:使用java线程的android,java,android,multithreading,Java,Android,Multithreading,我正在尝试创建一个简单的线程,它从一个按钮开始,但出现了一些问题。 代码如下: b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SendInfo si = new SendInfo(); si.start(); error.setTe
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
SendInfo si = new SendInfo();
si.start();
error.setText(si.getError());
}
});
以下是线程代码:
package com.example.android.location;
public class SendInfo extends Thread
{
private String error;
public void run()
{
this.error = "working";
}
public String getError(){
return this.error;
}
}
由于某些原因,第一个代码块中的错误实例保持为空。不能保证线程在这一行之后启动
si.start()代码>
因此,您不能只希望得到错误
,而希望它按预期设置。从外观上看,你的线没有穿
此外,在方法上进行同步是明智的,以防止指令的恶意重新排序
这个问题的一个整体解决方案是在主线程上创建一个线程,并在线程完成执行后向它发送消息。您最好使用ASyncTask而不是线程。您有一个竞争
调用start()
后:
1) 您的代码继续运行,并且getError
返回null,然后线程运行
或
2) 线程运行并完成,getError
将返回“working”
在你的情况下,情况正在发生
更新:从理论上讲,在选项2中,您可能不会得到“working”作为返回值。这是由于内存/线程可见性造成的。同步对错误变量的访问,或者在本例中仅声明字段volatile可以修复该问题(但不是您原来的问题)。我建议您使用。使用AsynCtask
可以在线程完成后执行UI操作。您可以与我们共享堆栈跟踪吗?当我开发第一个Android应用程序时,我使用java线程,因为它很熟悉。但后来我决定学习异步任务,让我告诉你们它要容易得多。试一试,它并不像最初看起来的那么糟糕出于某种原因?你有点开始发帖了。。。