您的位置:首页 > 移动开发 > Android开发

Android多线程和异步消息的简单应用

2017-06-02 22:45 387 查看
多线程在几乎所有的程序中都有很广泛的应用,而在安卓APP中也不例外.一个APP的主线程主要承担着系统事件,输入事件,程序回调服务,UI 绘制等等操作,如果在主线程执行耗时较长的操作,就会阻碍主线程反应这些时间,造成卡顿现象甚至是无响应状态.所以这时候多线程就派上用场了.

在JAVA里面,多线程通常使用Thread和Runnable实现

Thread mythread = new Thread(){
@Override
public void run() {
//要进行的操作
}
}.start();


但是通常子线程完成工作后需要通知主线程自己已经完成工作,有时候还需要传输相关数据到主线程进行处理或显示,在安卓中这些异步操作该怎么实现呢?这时候Handler就派上用场了.下面直接通过代码进行说明和演示.

public class MainActivity extends AppCompatActivity {

public static final int MSG = 0;

private final MyHandler mHandler = new MyHandler(this);

public Button button;
public TextView textView;

//定义一个继承Handler的静态内部类,实现handleMessage方法(必须实现)以处理从子线程返回的消息和数据
private static class MyHandler extends Handler {

//直接持有Activity容易产生内存泄漏.为防止内存泄漏,handler通过一个弱引用与Activity关联
private WeakReference<MainActivity> mActivity;

public MyHandler(MainActivity mainActivity) {
mActivity = new WeakReference<>(mainActivity);
}

@Override
public void handleMessage(Message msg) {
//通过判断Message的what字段进行对应的操作,what是用户自行定义的一个int类型的字段
switch (msg.what) {
case MSG:
mActivity.get().textView.append(new Date().toGMTString() + "\nMessage Data arg1: " + ((String) msg.obj) + "\n");
break;
default:
mActivity.get().textView.append("Undefine Message\n");
}
}
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

textView = (TextView) findViewById(R.id.text);
button = (Button) findViewById(R.id.run);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 1; i <= 5; i++) {
//子线程处理数据,可处理耗时较长的操作,如文件和网络IO,视频转码等等
final int l = i;
new Thread("ChildThread" + i) {
@Override
public void run() {
System.out.println("Thread \"" + currentThread().getName() + "\" is running");
Message message = new Message();
message.what = MSG;
//模拟子线程产生的数据,这里只简单的通过obj字段传输了一个简单的字符串,可通过setData()传输各种数据
//Bundle data = new Bundle();
//data.putXXX......
//message.setData(data);
message.obj = "Data from Thread " + currentThread().getName();
//延时发送消息,模拟各个线程处理时间的不同
mHandler.sendMessageDelayed(message, l * 500);
}
}.start();
}
}
});
}

}


运行截图:



通过Handler,我们就可以在子线程工作完成后通知主线程并把数据传回去进行后续操作.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息