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