Android(安卓)Handler:子线程发消息到UI主线程
16lz
2022-04-18
Activity代码:
public class MainActivity extends Activity { private MyThread myThread; private Handler handler; //子线程与UI主线程进行消息通信 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //通过Handler获取子线程推送过来的消息handler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);Bundle bundle = msg.getData();String value = bundle.getString("value");outputEditText.setText(value);}};//启动一个子线程myThread = new MyThread(handler);myThread.start();showDialog("Socket Thread Started!"); } /** * 对话框显示 */ private void showDialog(String msg){ new AlertDialog.Builder(this) .setTitle("提示") .setMessage(msg) .setPositiveButton("ok", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).show(); }}
Thread代码:
public class MyThread extends Thread{ private Handler handler; public MyThread(Handler handler){ this.handler = handler; } @Override public void run() { try { //持续向UI主线程发送当前日期时间 while(true){ TimeUnit.MILLISECONDS.sleep(1000); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date = sdf.format(new Date()); sendMessage(date); } } catch (Exception e) { e.printStackTrace(); } } /** * 向UI主线程发送消息 */ private void sendMessage(String msg){ Bundle data = new Bundle(); data.putString("value", msg); Message message = new Message(); message.setData(data); this.handler.sendMessage(message); }}
需要刷新UI时的Handle实例化:
在主线程中: Handler handler = new Handler();
在其他线程中: Handler handler = new Handler(Looper.getMainLooper());
不用刷新UI时的Handle实例化:
在主线程中: Handler handler = new Handler();
在其他线程中:
Looper.prepare();
Handler handler = new Handler();
Looper.loop();
或者
Handler handler = new Handler(Looper.getMainLooper());
message.what一般用于区别消息的。进程内传递数据可用setData(Bundle),进程间要用message.obj传递可序列化对象数据
更多相关文章
- Android(安卓)IntentService用法和源码分析
- Android(安卓)handler的Context内存泄露
- android 获取IP
- android字体闪烁动画(线程)
- Android消息机制不完全解析(下)
- Android消息推送机制调研
- android异步的几种方式
- Android(安卓)AudioFlinger
- Android中文API(128) —— HandlerThread