使用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线程,因为它很熟悉。但后来我决定学习异步任务,让我告诉你们它要容易得多。试一试,它并不像最初看起来的那么糟糕出于某种原因?你有点开始发帖了。。。