2

我正在尝试在 Android 中循环更新 UI,但我收到一条错误消息,提示我在错误的线程上。我不明白为什么,因为我使用的是处理程序。有没有人有什么建议?

TextView textView;
protected Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        textView.setText((String)msg.obj);  
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_thread_sleep);
    textView=(TextView) findViewById(R.id.TextView1);
    init();
}

public void init()
{
    CounterThread counterThread=new CounterThread();
    counterThread.start();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_thread_sleep, menu);
    return true;
}

class CounterThread extends Thread {

    @Override
    public void run() {
        super.run();
        int counter=0;

        handleString("in Thread handler");
        try{Thread.sleep(2000); }catch(Exception e){Log.d("Exception", e.toString());}

        while(counter<10)
        {
            counter++;
            String counterString=String.valueOf(counter);
            handleString(counterString);

            try{Thread.sleep(2000); }catch(Exception e){Log.d("Exception", e.toString());}
        }//while
    }//run 

    public void handleString(String string)
    {
        Message msg=handler.obtainMessage();
        msg.obj="counter"+" "+string;
        handler.handleMessage(msg);
    }

}//thread
4

2 回答 2

3

你调用Handler不正确。从您的后台线程中,调用handler.sendMessage()以将消息发布到队列中。这将随后在处理它时调用该handleMessage()方法。Handler

附带说明一下,如果您只使用后台线程在再次更新 UI 之前等待一段时间,您可能会考虑改用 using sendMessageDelayed()Handler能够自己安排时间,而无需创建第二个Thread.

于 2012-10-11T20:44:03.807 回答
-1

发生这种情况是因为您没有在 UI 线程上执行代码。所以,你应该使用 runOnUiThread 方法:http: //developer.android.com/reference/android/app/Activity.html#runOnUiThread (java.lang.Runnable )

所以,它是这样的:

protected Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        final String msgString = (String)msg.obj;
        runOnUiThread(new Runnable() {
            @Override
            void run() {
                textView.setText(msgString);
            }
        });
    }
};
于 2012-10-11T20:58:51.297 回答