0

我正在编写一个处理程序并尝试在 handlemessage 方法中打印线程名称,代码如下

public class handler extends Activity
{
    EditText et;
    Handler h=new Handler()
    {
    public void handleMessage(Message m)
    {
        Toast.makeText(getApplicationContext(), Thread.currentThread().getName(), Toast.LENGTH_SHORT).show();
    }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.handler);
        et=(EditText)findViewById(R.id.handle);
        Thread t=new Thread()
        {
            public void run()
            {
                int i=0;
                while(i<10)
                {
                    try
                    {
                    Thread.sleep(1000);
                    }catch(Exception ep){}
                    i++;
                    h.dispatchMessage(h.obtainMessage());
                }
            }
        };
        t.start();


    }

}

但是应用程序崩溃了。如果我使用 log.v 打印线程名称,它可以工作。请更新它发生的原因。谢谢特金德

4

1 回答 1

1

而不是使用这句话:

h.dispatchMessage(h.obtainMessage());

使用这个:

h.sendMessage(h.obtainMessage());

崩溃是因为您无法从除 MAIN 之外的任何线程对 UI 进行任何修改,通过调用 dispatchMessage 就像从您当前正在调用它的线程直接调用处理程序的 handleMessage 一样,在这种情况下,您正在执行它一个工作线程,但是通过调用h.sendMessage(h.obtainMessage());你强制处理程序使用它附加的线程来执行handleMessage,在你的情况下是主线程......

问候!

于 2013-06-07T16:09:33.867 回答