android多线程编程(Thread,Handle,AsycTask)

人生主干道只有一条,如同android的主线程,而路上的风景值得欣赏,无论走多远,请记得回家的路。这便是 Thread,Handle和AsycTask

  1. Thread的使用
    Android多线程编程和java多线程编程基本类似,定义一个线程只需新建一个类继承Thread,然后重写run()方法。
    1.1:创建自定义的类继承Thread
public class MyThread extends Thread {
    private static final String TAG = "MyThread";
    @Override
    public void run() {
        super.run();
        Log.i(TAG, "run: MyThread is running");
    }
}

调用的时候使用

new MyThread().start();//完成调用

1.2:创建自定义的类实现Runnable接口

public class MyOtherThread implements Runnable{
    private static final String TAG = "MyOtherThread";
    @Override
    public void run() {
        //处理事件的方法
        Log.i(TAG, "run: MyOtherThread is running");
    }

}

调用的方法

//说明:Thread的调用里面需要传递一个runnable对象,我们的类已经实现了该方法,所以只需要进行传入使用就好
MyOtherThread myOtherThread  = new MyOtherThread();
Thread otherThread = new Thread(myOtherThread);
otherThread.start();
Log.i(TAG, "onCreate: otherThread"+otherThread.currentThread().getId()+"***"+otherThread.currentThread().getName());

1.3:使用匿名类直接进行处理

//启动一个子线程,匿名的方法类
        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.i(TAG, "run: ThreadRunnable is running");
            }
        }).start();

以上是多线程编程的基本使用方法,java也是如此的。

2 . 在子线程中更新UI
Android的UI的线程并不是安全的,也就是说要更新应用的UI元素,必须在主线程中进行,否则会抛出异常。简言之,在子线程中你可以进行逻辑处理,但是涉及到UI的更新操作,你只能在主线程中进行。
2.1:基于上述的原因,在android中使用Thread的时候都是和Handler一起结合工作。

public class MainActivity extends AppCompatActivity {

 public static final int UPDATE_TEXT = 1;

 private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case UPDATE_TEXT:
                    textView.setText("update done");
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //******************************

        }
     /**
     * 点击按钮之后进行数据处理
     */
    public void ButtonOnclick(){
        //那么我么在点击之后启动一个子线程来完成数据的更新
        /*错误示例*/
        /*new Thread(new Runnable() {
            @Override
            public void run() {
                textView.setText("子线程更新Ui");
            }
        }).start();*/

        /*正确示例*/
        new Thread(new Runnable() {
            @Override
            public void run() {
                //发送Message对象
                Message message = new Message();
                message.what = UPDATE_TEXT;
                handler.sendMessage(message);
            }
        }).start();

    }
}

以上便是相应的方法,会使用并不是我们的最终目标,下面来说说android异步处理机制

3 . android异步处理机制:(Message/Handler/MessageQueue/Looper)
3.1 :Message 是在线程之间传递的消息,可以在内部携带少量的信息,用于在不同线程之间交换数据。
3.2:MessageQueue 消息队列,主要存放所有通过handler发送的消息
3.3:Looper:相当于MessageQueue的管家,调用Looper.loop()方法后,就会进入一个无限循环的状态,然后每当发现MessageQueue中存在一条消息,就会将其取出,并传递到Handler的handleMessage()方法中
3.4:Handler 处理者

在此附一张图来直观的看看工作原理:声明该图片参考郭霖的书籍《第一行代码》第二版中关于线程讲解一书
这里写图片描述

4 .AsycTask的使用方法(后面的blog中会在service进行详细讲解并使用)关于service的使用

完。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值