Main/UI Thread && Worker Thread
一般情况下,Worker线程不能直接更新主线程的设置(例如textview.settext()),否则会报错。
若要更新,一般用到以下4种方法:
-
Activity runOnUiThread(Runnable)
-
View.post(Runnable)
-
View.postDelayed(Runnable, long)
-
new Handler(Looper.getMainLooper()).post
new Thread(new Runnable() { @Override public void run() { // 第一种 runOnUiThread(new Runnable() { @Override public void run() { mTextView.setText("……"); } }); // 第二种 mTextView.post(new Runnable() { @Override public void run() { mTextView.setText("……"); } }) ; // 第三种 mTextView.postDelayed(new Runnable() { @Override public void run() { mTextView.setText("……"); } },1000); // 第四种 new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { mTextView.setText("……"); } }); } }).start();
线程池
ExecutorServie 线程池,适合处理大量线程。
通过Executors的静态方法来创建,一般有三种:
- 单线程 :<code>Executors.newSingleThreadExecutor()</code>;
- 固定数量线程 :<code>Executors.newFixedThreadPool()</code>;
- 动态线程 :<code>Executors.newCachedThreadPool()</code>;
- 定时线程:<code>Executors.newScheduleThreadPool()</code>;
这里我们用固定几个线程来应用,使用方法是创建<code>ExecutorService</code>对象,然后执行<code>submit(r)</code>可以发起一个<code>Runnable</code>对象。
用线程池来管理的好处是,可以保证系统稳定运行,适用与有大量线程,高工作量的情景下使用,假如要展示1000张图片如果创建1000个线程去加载,保证系统会死掉。用线程池就可以避免这个问题,可以用几个线程轮流执行,几个一组,执行完的线程不直接回收而是等待下次执行,这样对系统的开销就可以减小不少。
private ExecutorService service = Executors.newFixedThreadPool(5);
private void loadImagesByExecutors(final String url,final int id){
service.submit(new Runnable(){
@Override
public void run() {
Log.e("当前线程程:",""+Thread.currentThread().getName());
try {
final Drawable drawable = Drawable.createFromStream(new URL(url).openStream(), "image.gif");
mHandler.post(new Runnable(){
@Override
public void run() {
//这将在主线程运行
((ImageView)MainActivity.this.findViewById(id)).setImageDrawable(drawable);
}
});
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
网友评论