handlemessage处理程序类不使用toast

时间:2013-06-07 14:25:37

标签: android

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

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来打印它的工作线程名称。请更新它为什么会发生。 谢谢 tejinder

1 个答案:

答案 0 :(得分:1)

而不是使用这句话:

h.dispatchMessage(h.obtainMessage());

使用这个:

h.sendMessage(h.obtainMessage());

崩溃是因为你不能从MAIN以外的任何线程对UI做任何修改,通过调用dispatchMessage就像从你当前调用它的线程直接调用处理程序的handleMessage,在这种情况下你是在工作线程中执行此操作,但是通过调用h.sendMessage(h.obtainMessage());,您强制处理程序使用它所附加的线程来执行handleMessage,在您的情况下是MAIN线程......

问候!