Android多线程(Thread)的概述与使用

多线程:

    1.为什么要使用多线程:

                          ①执行耗时操作:网络下载、大文件读写、数据库操作...;

                          ②为了不阻塞用户界面,出现ANR;

    2.多线程的使用:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new MyThread("传递字符串").start()//实例化调用子线程并传参
    }

    //创建子线程,继承主线程
    private class MyThread extends Thread {

        private String text;

        //接收参数
        public MyThread(String text) {
            this.text = text;
        }

        //通过子线程的run方法,创建消息(Message)并赋值,接着通过Handler的sendMessage方法传递消息到Handler的handleMessage方法做处理
        public void run() {

            try {

            } catch (Exception e) {

            }

        }

    }

}

Looper

当应用程序的进程一创建时,系统就给该进程提供了一个Looper(死循环,内部维护消息队列)。

Looper不断地从消息队列中取消息,取到消息就发送给Handler,Handler根据收到的消息去修改UI。

① Handler:

    1.本意:处理器、处理者、管理者、句柄;

    2.功能:发送消息和处理消息

    3.Handler消息处理机制:

                          

    4.Handler机制的关键对象:

            ①Message(消息):线程间传递的消息,可以在内部携带少量的信息;

            ②MessageQueue(消息队列):存放Handler发送的消息。每个线程只有一个MessageQueue

            ③Handler(处理器):通过sendMessage()发送消息和handleMessage()处理消息

            ④Looper(MessageQueue管家):当调用loop()方法后进入无限循环,等待MessageQueue存在消息,则将其取出,并传递到Handler的handleMessage()中。每个线程只有一个Looper对象

    5.使用Handler和子线程与UI线程的IPC:

package com.example.mjon.myapplication;

import
android.app.Activity;
import
android.os.Bundle;
import
android.os.Handler;
import
android.os.Message;
import
android.widget.TextView;
import
android.widget.Toast;

public class
MainActivity extends Activity {

   
private TextViewtv;
   
//消息类型
   
private static final int UPDATE = 0;
   
private static final int ERROR = 1;

   
//消息处理
   
private Handlerhandler = new Handler() {

       
@Override
       
public void handleMessage(Messagemessage) {
           
//分发处理
           
if (message.what== UPDATE) {
               
tv.setText(String.valueOf(message.obj));
           
} elseif(message.what == ERROR){
               
Toast.makeText(MainActivity.this, "出错!", Toast.LENGTH_SHORT).show();
           
}
       
}

    };

   
@Override
   
protected void onCreate(BundlesavedInstanceState) {
       
super.onCreate(savedInstanceState);
       
setContentView(R.layout.activity_main);
       
tv =(TextView) findViewById(R.id.tv);
       
new MyThread("修改显示文本信息").start()//实例化调用子线程并传参
   
}

   
//创建子线程,继承主线程
   
private class MyThread extends Thread {

       
private Stringtext;

       
//接收参数
        public MyThread(String text) {
           
this.text = text;
       
}

       
//通过子线程的run方法,创建消息(Message)并赋值,接着通过Handler的sendMessage方法传递消息到Handler的handlerMessage方法做处理
        public void run() {

           
//创建消息对象,传递状态和信息
           
try {
               
Message message = new Message();
               
message.what= UPDATE//设置消息类型
 
              message.obj = text//传递值
               
handler.sendMessage(message)//发送消息
           
} catch(Exception e) {

           
}

        }

    }

}

    6.总结:主线程的职责是创建、显示和更新UI控件,处理UI事件、启动子线程、停止子线程;

                 子线程的职责是向主线程发出更新UI消息;

                 子线程和主线程通过Message和MessageQueue实现线程间的通信。


猜你喜欢

转载自blog.csdn.net/march0000/article/details/80001320
今日推荐