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();
}
}
}
Handler子线程中的运用
最新推荐文章于 2023-12-24 20:38:50 发布