【Android开发-25】Android中多线程编程用法介绍

1,线程基本用法

在Android中,线程的使用主要有两种方法:一种是扩展java.lang.Thread类,另一种是实现Runnable接口。

1.1以下是一个简单的Android线程继承Thread的用法示例:

cpp 复制代码
public class MyThread extends Thread {
    @Override
    public void run() {
        // 在这里编写需要在线程中执行的代码
        for (int i = 0; i < 10; i++) {
            System.out.println("线程运行中:" + i);
            try {
                Thread.sleep(1000); // 让线程休眠1秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 创建并启动线程
        MyThread myThread = new MyThread();
        myThread.start();
    }
}

1.2在Android中,Runnable接口通常用于实现线程。以下是一个简单的Runnable接口参考代码例子:

cpp 复制代码
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 在这里编写需要在线程中执行的代码
        for (int i = 0; i < 10; i++) {
            System.out.println("线程运行中:" + i);
            try {
                Thread.sleep(1000); // 让线程休眠1秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 创建并启动Runnable对象
        MyRunnable myRunnable = new MyRunnable();
        new Thread(myRunnable).start();
    }
}

在这个例子中,我们创建了一个名为MyRunnable的类,实现了Runnable接口,并在run()方法中编写了需要在线程中执行的代码。然后在MainActivity中创建并启动了一个MyRunnable对象。

1.3在Android中,匿名类线程用法代码例子如下:

cpp 复制代码
new Thread(new Runnable() {
    @Override
    public void run() {
        // 在这里编写需要在线程中执行的代码
        for (int i = 0; i < 10; i++) {
            System.out.println("线程运行中:" + i);
            try {
                Thread.sleep(1000); // 让线程休眠1秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}).start();

在这个例子中,我们创建了一个匿名类实现Runnable接口,并在run()方法中编写了需要在线程中执行的代码。然后通过new Thread(new Runnable())创建一个新线程并启动它。

2,异步消息处理机制

Android中的异步消息处理机制主要由四个部分组成:Message、Handler、MessageQueue和Looper。Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。通常使用Message的what字段携带命令,除此之外还可以使用arg1和arg2字段来携带一些整形数据,使用obj字段携带一个Object对象。

Handler是处理者的意思,它主要是用于发送和处理消息的。在Android中,所有耗时操作都应该放到其他线程中去处理,而UI更新必须在主线程(UI线程)上进行,否则就会抛出异常。这时就需要用到Handler,它是Android提供用来异步更新UI的一套机制,也是一套消息处理机制,可以用它来发送消息,也可以用它来接收消息。

MessageQueue是一个消息队列,用于存放Message对象。

Looper是一个线程循环器,用于遍历MessageQueue中的消息并进行处理。当有耗时操作,比如在子线程中下载文件,通知UI线程下载进度,UI线程去更新进度等,这个时候我们就需要用到异步消息处理。

3,使用handler发送和处理消息来更新UI的方式

在Android中,使用Handler发送和处理消息的参考代码如下:

首先创建一个Handler对象:

cpp 复制代码
private Handler handler = new Handler(Looper.getMainLooper()) {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        // 在这里处理接收到的消息
    }
};

然后创建一个Message对象,并设置要发送的数据:

cpp 复制代码
Message message = Message.obtain();
message.what = 1; // 设置消息类型
message.obj = "Hello, Handler!"; // 设置要发送的数据

使用Handler对象的sendMessage方法发送消息:

cpp 复制代码
handler.sendMessage(message);

最后,在Handler的handleMessage方法中处理接收到的消息。例如,可以在handleMessage方法中更新TextView的文本:

cpp 复制代码
private Handler handler = new Handler(Looper.getMainLooper()) {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        // 在这里处理接收到的消息
        if (msg.what == 1) {
            String text = (String) msg.obj;
            TextView textView = findViewById(R.id.textView);
            textView.setText(text);
        }
    }
};

4,asynctask方法

在Android中,AsyncTask是一个用于在后台线程执行长时间运行的操作,同时不阻塞主线程的类。以下是一个简单的AsyncTask方法参考代码例子:

首先,创建一个继承自AsyncTask的类,例如MyAsyncTask:

cpp 复制代码
import android.os.AsyncTask;
import android.widget.TextView;

public class MyAsyncTask extends AsyncTask<Void, Void, String> {
    private TextView textView;

    public MyAsyncTask(TextView textView) {
        this.textView = textView;
    }

    @Override
    protected String doInBackground(Void... voids) {
        // 在这里执行耗时操作,例如网络请求、文件读写等
        return "异步任务执行结果";
    }

    @Override
    protected void onPostExecute(String result) {
        // 将结果显示在UI线程上
        textView.setText(result);
    }
}

然后,在需要执行异步任务的地方,创建并启动MyAsyncTask实例:

cpp 复制代码
TextView textView = findViewById(R.id.textView);
new MyAsyncTask(textView).execute();

这样,当调用execute()方法时,MyAsyncTask会在后台线程中执行doInBackground()方法中的耗时操作,然后在onPostExecute()方法中将结果显示在UI线程上。

相关推荐
阿巴斯甜5 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker5 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95276 小时前
Andorid Google 登录接入文档
android
黄林晴7 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab20 小时前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android