Handler子线程中的运用
来源:互联网 发布:js定时执行 编辑:程序博客网 时间:2024/05/22 00:51
package com.example.tyxiong.myapplication;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.view.View;import android.widget.EditText;import android.widget.Toast;import java.util.ArrayList;import java.util.List;/** UI线程中不能处理耗时任务 ANR* 其他线程不能更新UI组件的状态 UI组件是线程(多线程)不安全的考虑性能,只允许主线程更新* Handler的用法 Handler Message MessageQueue Looper* Handler其他线程(不具有该Handler的线程)中发送消息Message* MessageQueue用于管理Message* Looper用于循环从MessageQueue里取Message给到Handler处理* Handler本线程中(具有该Handler的线程),处理Looper给过来的Message,用这个处理方法handleMessage()** 分情况一 用主线程的Handler消息机制 Handler对象在子线程中发消息, 并在主线程中接收它发的消息,调用HandlerMessage()方法处理接收的消息.* 主线程本身已具备Looper MessageQueue对象* 1 只需创建Handler的子类实例(匿名内部类),实现其处理方法handlerMessage()* 2 Handler实例就可在子线程中发送消息啦....整条流程完整了** 情况二 子线程Handler消息机制,* 啥都没有....Looper Handler MessageQueue(生成Looper时随之生成)* 1 创建Looper对象, Looper.prepare()* 2 创建Handler的子类实例(匿名内部类),实现其处理方法handlerMessage()* 3 启动Looper工作 Looper.loop()* 4 Handler实例就可在其他线程中发送消息啦....整条流程完整了*//** Handler子线程中的运用 UI线程中不能处理耗时任务 其他线程不能更新UI组件的状态*/public class MainActivity extends Activity { private static final String NUMBER = "number"; private EditText editText; private Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.et1); new NumberThread().start(); /*启动一条子线程*/ } public void go(View view) { Message message = new Message(); message.what = 0x111; int number = Integer.parseInt(editText.getText().toString()); Bundle bundle = new Bundle(); bundle.putInt(NUMBER, number); message.setData(bundle); handler.sendMessage(message); /*主线程中发送消息*/ } class NumberThread extends Thread { private int number; @Override public void run() { Looper.prepare(); /*1*/ handler = new Handler() { /*2*/ @Override public void handleMessage(Message msg) { if (msg.what == 0x111) { number = msg.getData().getInt(NUMBER); adds(number); } } }; Looper.loop(); /*3 死循环取消息*/ } public void adds(int number) { List<Integer> list = new ArrayList<>(); for (int i = 1; i <= number; i++) { for (int j = 2; j <= i / 2; j++) { if (i % j == 0) { list.add(i); break; } } } Toast.makeText(MainActivity.this, list.toString(), Toast.LENGTH_SHORT).show(); } }}
0 0
- Handler子线程中的运用
- 创建子线程中的Handler
- Looper、Handler在子线程中的应用
- android 子线程不用handler 控制UI线程中的组件
- 子线程创建Handler
- 子线程+Handler简单实现
- android子线程创建handler
- 子线程中创建handler
- 子线程handler与handlerThread
- Android 子线程创建handler
- Handler 线程中的使用
- Handler机制在秒表中的运用
- Handler: 主线程如何通知子线程
- Handler: 主线程如何通知子线程
- Handler: 主线程如何通知子线程
- Handler: 主线程如何通知子线程
- Android Handler 主线程 子线程 双向通信
- Handler: 主线程如何通知子线程
- Git命令
- Leetcode 45. Jump Game II dp优化 (给出了5种思路)
- JavaSE第一阶段总结冒泡排序
- C#学习笔记二 在类下不能对变量赋值,赋值必须发生在函数中
- singleton单例-饿汉式|懒汉式
- Handler子线程中的运用
- 虚拟机ubuntu 使用adb 编译调试系统app Settings.apk
- SATA、SCSI、SAS区别与特点
- AndroidStudio git需要忽略的文件总结
- 关于安卓listview的一个简单错误Attempt to invoke virtual method
- inline和override的注意点
- Cola HDU1495
- php字符串函数和数组函数
- Android复习之旅--ListView中Adapter的使用