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

相关推荐
C4rpeDime2 小时前
自建MD5解密平台-续
android
鲤籽鲲4 小时前
C# Random 随机数 全面解析
android·java·c#
m0_548514777 小时前
2024.12.10——攻防世界Web_php_include
android·前端·php
凤邪摩羯8 小时前
Android-性能优化-03-启动优化-启动耗时
android
凤邪摩羯8 小时前
Android-性能优化-02-内存优化-LeakCanary原理解析
android
喀什酱豆腐8 小时前
Handle
android
m0_7482329210 小时前
Android Https和WebView
android·网络协议·https
m0_7482517210 小时前
Android webview 打开本地H5项目(Cocos游戏以及Unity游戏)
android·游戏·unity
m0_7482546612 小时前
go官方日志库带色彩格式化
android·开发语言·golang
zhangphil12 小时前
Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现“刮刮乐”效果,Kotlin(2)
android·kotlin