Android 多线程编程

来源:互联网 发布:电脑怎么删除软件 编辑:程序博客网 时间:2024/05/22 06:57

1.定义一个线程只需要新建一个类继承Thread

class MyThread extends Thread {@Overridepublic void run() {// 处理具体的逻辑}}

然后调用它的start()方法,就可以执行run()方法中的代码了

new MyThread().start();

2.实现Runnable接口

class MyThread implements Runnable {@Overridepublic void run() {// 处理具体的逻辑}}
实现:

MyThread myThread = new MyThread();
new Thread(myThread).start();

可以看出Thread的构造函数接收Runnable接口,调用Thread()的start()方法 ,run()方法的代码就执行了;

3.匿名类

new Thread(new Runnable() {@Overridepublic void run() {// 处理具体的逻辑}}).start();
4.在多线程中更新UI会crash,添加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() {@Overridepublic void run() {Message message = new Message();message.what = UPDATE_TEXT;handler.sendMessage(message); // 将Message对象发送出去}}).start();

5.异步消息处理机制

1. Message
Message 是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线
程之间交换数据。上一小节中我们使用到了Message 的what 字段,除此之外还可以使
用arg1 和arg2 字段来携带一些整型数据,使用obj 字段携带一个Object 对象。
2. Handler
Handler 顾名思义也就是处理者的意思,它主要是用于发送和处理消息的。发送消
息一般是使用Handler 的sendMessage()方法,而发出的消息经过一系列地辗转处理后,
最终会传递到Handler 的handleMessage()方法中。
3. MessageQueue
MessageQueue 是消息队列的意思,它主要用于存放所有通过Handler 发送的消息。
这部分消息会一直存在于消息队列中,等待被处理。每个线程中只会有一个MessageQueue
对象。
4. Looper
Looper 是每个线程中的MessageQueue 的管家,调用Looper 的loop()方法后,就会
进入到一个无限循环当中,然后每当发现MessageQueue 中存在一条消息,就会将它取
出,并传递到Handler 的handleMessage()方法中。每个线程中也只会有一个Looper 对象。

6使用AsyncTask

为AsyncTask 类指定三个泛型参数

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

class DownloadTask extends AsyncTask<Void, Integer, Boolean> {@Overrideprotected void onPreExecute() { // 显示进度对话框}@Overrideprotected Boolean doInBackground(Void... params) {try {while (true) {int downloadPercent = doDownload(); // 这是一个虚构的方法publishProgress(downloadPercent);if (downloadPercent >= 100) {break;}}} catch (Exception e) {return false;}return true;}@Overrideprotected void onProgressUpdate(Integer... values) {// 在这里更新下载进度progressDialog.setMessage("Downloaded " + values[0] + "%");}@Overrideprotected void onPostExecute(Boolean result) { // 关闭进度对话框// 在这里提示下载结果if (result) {Toast.makeText(context, "Download succeeded",Toast.LENGTH_SHORT).show();} else {Toast.makeText(context, " Download failed",Toast.LENGTH_SHORT).show();}}}








0 0
原创粉丝点击