Android学习(七)Android多线程初学
多线程
开发中一定会需要用到多线程开发。当遇到耗时操作,如果都放在主线程就会造成app ANR,用户体验极差。所有我们需要把这些不需要对UI进行操作的开发放到子线程中。
后续会继续完善内容。
基本用法
继承Thread
- 继承Thread后,重写run()方法。
class TestThread extends Thread {
@Override
public void run() {
super.run();
//具体的逻辑处理
}
}
- 启动线程
new TestThread().start();
实现Runnable接口
- 实现接口
class TestRunnable implements Runnable {
@Override
public void run() {
//具体的逻辑处理
}
}
- 启动线程
new Thread(new TestRunnable()).start();
异步消息处理 Handle
使用handle尽量使用弱引用,避免内存泄漏。这里我就偷懒,写个简单的。
1.创建一个handle对象,重写handleMessage()方法
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
Toast.makeText(FourthActivity.this, "handle 收到消息", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
};
- 使用handle
调用handle的sendEmptyMessage()方法,他还有许多方法,大家可以查看。
handler.sendEmptyMessage(1);
这样handle就会收到这个消息,他有一套自己的异步处理机制,所以使用起来还是很方便的。
AsyncTask
Android还提供了AsyncTask供我们异步处理消息。它是一个抽象类,所以我们需要继承实现它。
- 创建继承AsyncTask
package com.example.testapplication;
import android.os.AsyncTask;
public class TestAsyncTask extends AsyncTask<Void, Integer, Integer> {
@Override
protected void onPreExecute() {
}
@Override
protected Integer doInBackground(Void... voids) {
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
}
@Override
protected void onPostExecute(Integer integer) {
}
}
方法名 | 用途 |
---|---|
onPreExecute() | 任务开始时执行,用于进行资源的准备和初始化。 |
doInBackground() | 在子线程中运行,用于执行耗时后台操作。 |
onProgressUpdate() | 在任务中调用publishProgress()方法后,更新UI界面操作。 |
onPostExecute() | 在任务结束返回return后,执行。用于UI界面操作及资源释放。 |
- 启动任务
new TestAsyncTask().execute();