android中多线程初步
1.Android 中多线程应用机制?
(1) 主线程负责执行UI操作(用户输入,事件的处理,UI的更新)
(2 ) 工作线程负责执行耗时操作(例如下载,联网,访问数据库)
Android中这样对线程分工目的是尽量不要阻塞主线程,让主线程更好的服务于用户,给用户一种更好的应用体验。
2.Android 中多线程应用消息模型概述?
Android 消息模型是在尽量不阻塞主线程的情况下推出的一种线程通讯机制,此机制的实现主要是借助线程之间消息的传递。例如工作线程执行完耗时操作可以发一个消息给主线程,让主线程执行
UI的更新操作,这个过程中主线程无需等待。
此消息模型中同样提供了一种任务轮询机制,让线程不断的去迭代任务队列,延长此线程的生命周期,让此线程可以不断的执行多个任务,从而可以避免多个线程对象的创建,销毁带给系统的性能开销,
3.Android 中多线程消息模型需要的API
(1)Message (消息对象,封装数据)
(2)MessageQueue(消息队列,存储多个消息对象)
(3)Looper(消息迭代器,负责从消息队列取消息)
(4)Handler(消息处理器,负责发送,处理消息对象)
下面我们看个案例:模拟数据的异步加载
布局文件中添加一个listview
MainActivity代码如下,请看注释
public class MainActivity extends Activity {
private ListView lv;
private List<String> list;
private ArrayAdapter<String> adapter;
private ProgressBar pro;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pro=new ProgressBar(this);
lv = (ListView) findViewById(R.id.listView1);
list = new ArrayList<String>();
//初始listview显示为一个默认的progressbar
lv.addFooterView(pro);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
lv.setAdapter(adapter);
//异步加载
loadAsync();
}
class MainHandler extends Handler {
public MainHandler() {
//获取主线程的looper
super(Looper.getMainLooper());
}
public void handleMessage(Message msg) {
if(msg.what==1){
//刷新listview
adapter.notifyDataSetChanged();
//移除progressbar
lv.removeFooterView(pro);
}
};
}
private void loadAsync() {
new Thread() {
@Override
public void run() {
MainHandler mh = new MainHandler();
for (int i = 0; i < 10; i++) {
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
list.add("" + i);
}
//子线程添加一个内容后,每次发送一个消息给主线程
mh.sendEmptyMessage(1);
}
}.start();
}
}
运行效果如下