android--多线程,Android中的多线程-Handler

对于UI线程中比较耗时的工作,开启一个子线程来处理这些工作: 首先创建一个Thread对象,然后调用start( )方法启动新的子线程。

使用子线程解决异步执行带来的新问题: 在Android中,只有UI线程(即主线程)才可以更新主UI界面,而其子线程不能更新UI视图。

使用多线程实现:Thread+Handler

Handler定义在主线程中(UI线程中);

Handler充当主线程和子线程之间交互的中介:

Handler在新启动的子线程中发送消息;

Handler在主线程中获取并处理子线程所发送的消息。

Handler的使用方法

f873f4f295be0d8cee0587282db1811b.png

重要的类:

UI线程:创建UI线程时,初始化一个Looper对象以及与其关联的MessageQueue;

Handler:发送与处理信息,在当前线程中有一个Looper对象;

Message:Handler接收与处理的消息对象;

MessageQueue:消息队列,管理Message;

Looper:管理MessageQueue, 取出Message分发给对应的Handler处理,每个线程只有一个Looper。

Handler类的常用方法如下表所列:

d96fd3635e9ec497d92fc4bc79ab7be0.png

★ 基本流程 - 创建Handler,并添加handleMessage方法。

使用自定义的匿名子类的方法创建Handler对象,并重写handleMessage方法实现消息的处理。

Handler handler = new Handler() {

public void handleMessage (Message msg) {

switch (msg.what) {

case MSG_CURRENT: // TODO

break;

}

}

};

★ 基本流程 - 创建Thread对象,在Thread对象的run方法中发送消息。

使用自定义的匿名子类的方法创建Thread对象,并重写run方法实现消息的参数设置和添加到消息队列中等操作。

Thread backgroundThread = new Thread() {

public void run() {

Message msg = handler.obtainMessage();

msg.what = MSG_CURRENT;

handler.sendMessage(msg);

}

};

★ 基本流程 - 启动Thread对象:

backgroundThread.start();

示例(求斐波那契数):

import android.graphics.Color;

import android.os.Handler;

import android.os.Looper;

import android.os.Message;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

private EditText etInput = null;

private TextView tvOutput = null;

private Handler mainHandler = null;

private Handler workHandler = null;

private final int WORK_TO_MAIN = 1;

private final int MAIN_TO_WORK = 2;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

etInput = findViewById(R.id.et_input);

tvOutput = findViewById(R.id.tv_output);

// 在UI主线程创建Handler

mainHandler = new Handler() {

// 当Handler在消息队列中获取到消息时被调用

@Override

public void handleMessage(Message msg) {

Log.e("Handler",

Thread.currentThread().getName()

+ ":4收到数据:" + msg);

switch (msg.what) {

case WORK_TO_MAIN:

tvOutput.setText((long)msg.obj+"");

tvOutput.setBackgroundColor(

Color.rgb(255,0,0));

break;

}

}

};

MyThread thread = new MyThread();

thread.start();

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

String strInput = etInput.getText().toString();

int n = Integer.parseInt(strInput);

Message msg = new Message();

msg.obj = n;

msg.what = MAIN_TO_WORK;

workHandler.sendMessage(msg);

Log.e("Handler",

Thread.currentThread().getName()

+ ":3发送数据:" + msg);

}

});

}

// 自定义的线程类

private class MyThread extends Thread {

@Override

public void run() {

Looper.prepare();

workHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

Log.e("Handler",

Thread.currentThread().getName()

+ ":1收到数据:" + msg);

switch (msg.what) {

case MAIN_TO_WORK:

int n = (int)msg.obj;

long answer = fib(n);

Message msgAnswer = new Message();

msgAnswer.obj = answer;

msgAnswer.what = WORK_TO_MAIN;

mainHandler.sendMessage(msgAnswer);

Log.e("Handler",

Thread.currentThread().getName()

+ ":2发送数据:" + msgAnswer);

break;

}

}

};

Looper.loop();

}

}

// 求第n项的斐波那契数为多少,1=1, 2=1, 3=2, 4=3, 5=5, 6=8 ...

private long fib(int n) {

if(n==1 || n==2)

return 1;

else

return fib(n-1) + fib(n-2);

}

}

运行结果:

22b4c000014e54636fef4127ebc75e17.png

本文地址:https://blog.csdn.net/qq_43573997/article/details/107284619

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值