这个问题可以由Handler的一个子类HandlerThread来解决。
程序参考自Mars老师的Android课程第一季第十五集。
代码以及注释有所改动,如下:
- package com.handler.androidhandler02;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.HandlerThread;
- import android.os.Looper;
- import android.os.Message;
- public class FirstActivity extends Activity
- {
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_first);
- //取得HandlerThread对象
- HandlerThread handlerThread = new HandlerThread("handlerThead");
- handlerThread.start();
- //通过HandlerThread对象的getLooper方法取得异步线程(这里自定义为SonHandler)类的对象
- SonHandler sonHandler= new SonHandler(handlerThread.getLooper());
- //通过已经取得的异步线程类来取得Message对象
- Message notice=sonHandler.obtainMessage();
- //设置要传递的消息,通过Bundle对象来实现
- Bundle b = new Bundle();
- b.putString("name","Tom");
- notice.setData(b);
- }
- // 自定义SonHandler需要继承Handler,并且需要重新书写构造方法,第二个构造方法的参数Looper是必须的,这个Looper与上面创建这个类的getLooper()相关
- class SonHandler extends Handler
- {
- public SonHandler(){}
- public SonHandler(Looper looper)
- {
- super(looper);
- }
- // 下面是错误的写法……
- // public void SonHandler(Looper looper)
- // {
- // super(looper);
- // }
- //覆写方法对要处理的Message信息进行处理
- @Override
- public void handleMessage(Message notice)
- {
- Bundle b= notice.getData();
- //得到字符串的键值
- String name = b.getString("name");
- System.out.println(name);
- }
- }
- }