美文网首页
Android Thread & AsyncTask & han

Android Thread & AsyncTask & han

作者: YuQiao0303 | 来源:发表于2019-02-18 10:12 被阅读0次

《第一行代码》第十章笔记

线程用法

new Thread(new Runnable() {
@Override
public void run() {
// 处理具体的逻辑
}
}).start();

子线程中更新UI

如果想要更新应用程序里的UI元素, 则必须在主线程中进行, 否则就会出现异常

解决办法:
主线程中写一个Handler用来处理消息,子线程中发送消息

主线程:

private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_TEXT:
// 在这里可以进行UI操作
text.setText("Nice to meet you");
break;
default:
break;
}
}
};

子线程:

new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message); // 将Message对象发送出去
}
}).start();

解析异步消息处理机制

使用AsyncTask——基于异步消息处理机制,更好的封装,更方便使用

为了更加方便我们在子线程中对UI进行操作, Android还提供了另外一些好用的工具, 比如AsyncTask。
借助AsyncTask, 即使你对异步消息处理机制完全不了解, 也可以十分简单地从子线程切换到主线程。
当然, AsyncTask背后的实现原理也是基于异步消息处理机制的, 只是Android帮我们做了很好的封装而已。

在继承时我们可以为AsyncTask类指定3个泛型参数, 这3个参数的用途如下。

  1. Params 。 在执行AsyncTask时需要传入的参数, 可用于在后台任务中使用。
  2. Progress 。 后台任务执行时, 如果需要在界面上显示当前的进度, 则使用这里指定的泛
    型作为进度单位。
  3. Result 。 当任务执行完毕后, 如果需要对结果进行返回, 则使用这里指定的泛型作为返回值类

在onPreExecute()方法中进行一些界面上的初始化操作, 比如显示一个进度条对话框等
在doInBackground() 方法中执行具体的耗时任务,
在onProgressUpdate() 方法中进行UI操作,
在onPostExecute() 方法中执行一些任务的收尾工作

如果想要启动这个任务, 只需编写以下代码即可:
new DownloadTask().execute();
这样就不用考虑异步消息处理机制了

AndroidThreadTest 的完整代码


activity_main.xml:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/change_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Change Text" />
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Hello world"
        android:textSize="20sp" />
</RelativeLayout>

mainActivity.java:


package com.example.androidthreadtest;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    public static final int UPDATE_TEXT = 1;
    private TextView text;
    private Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case UPDATE_TEXT:
// 在这里可以进行UI操作
                    text.setText("Nice to meet you");
                    break;
                default:
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) findViewById(R.id.text);
        Button changeText = (Button) findViewById(R.id.change_text);
        changeText.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.change_text:
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Message message = new Message();
                        message.what = UPDATE_TEXT;
                        handler.sendMessage(message); // 将Message对象发送出去
                    }
                }).start();
                break;
            default:
                break;
        }
    }
}

相关文章

网友评论

      本文标题:Android Thread & AsyncTask & han

      本文链接:https://www.haomeiwen.com/subject/rqioeqtx.html