-1

我正在尝试创建一个从 Button 开始的简单线程,但出现了问题。这是代码:

    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;
    }   
}

由于某种原因,第一个代码块中的错误实例保持为空。

4

3 回答 3

2

你有一场比赛。

通话后start()

1)您的代码继续并getError在线程运行之后返回 null 和之后。

或者

2)线程运行并完成getError并将返回“工作”。

在你的情况下 1) 正在发生。

更新:实际上理论上在选项 2 期间,您可能无论如何都无法将“工作”作为返回值。这是由于内存/线程可见性。同步对错误变量的访问,或者在这种情况下只是声明该字段 volatile 修复了该问题(但不是您的原始问题)。

于 2012-12-20T14:16:43.417 回答
1

不能保证线程在此行之后开始

si.start();

所以你不能只是error希望它按预期设置。你的帖子看起来不像。

此外,在方法上同步是明智的,以防止令人讨厌的指令重新排序。

一个整体解决这个问题的方法是在主线程上创建一个处理程序,并在你的线程完成执行后向它发送一条消息。

于 2012-12-20T14:15:34.997 回答
1

您应该更好地使用 ASyncTask 而不是 Thread。

于 2012-12-20T14:16:07.167 回答