【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线程上。

相关推荐
开心呆哥几秒前
【如何使用 ADB 脚本批量停止 Android 设备上的所有应用】
android·adb
CYRUS STUDIO1 小时前
ARM64汇编寻址、汇编指令、指令编码方式
android·汇编·arm开发·arm·arm64
weixin_449310842 小时前
高效集成:聚水潭采购数据同步到MySQL
android·数据库·mysql
Zender Han2 小时前
Flutter自定义矩形进度条实现详解
android·flutter·ios
白乐天_n4 小时前
adb:Android调试桥
android·adb
姑苏风8 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
数据猎手小k11 小时前
AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。
android·人工智能·机器学习·语言模型
你的小1012 小时前
JavaWeb项目-----博客系统
android
风和先行12 小时前
adb 命令查看设备存储占用情况
android·adb
AaVictory.13 小时前
Android 开发 Java中 list实现 按照时间格式 yyyy-MM-dd HH:mm 顺序
android·java·list