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

android快速响应(一)后台线程实例

2012-06-17 20:10 232 查看
当android的一个activity处理某些事情而占用大量的时间时,会导致程序反应慢,让用户感觉程序没有快速响应或程序已停止。解决方法有两种:使用后台线程和使用android提供的AsynTask类。

创建一个handler类的实例,后台线程向handler发送消息,然后刷新UI,达到快速响应的目的。handler通信的方式有两种:message和Runnable对象。下面是通过handler更新progressBar的例子的不同写法:

1、message对象的实例:

import android.R;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.ProgressBar;

public class ExpThreader extends Activity {
private ProgressBar pBar;
private Handler handler;
private Boolean isRunning = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
lp.setMargins(10, 10, 10, 10);
pBar = new ProgressBar(this, null, R.attr.progressBarStyleHorizontal);
pBar.setProgress(0);
pBar.setMax(50);
layout.addView(pBar, lp);
setContentView(layout);
isRunning = true;
handler = new Handler() {

@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Integer add = (Integer) msg.obj;
pBar.incrementProgressBy(add);
}

};
new Thread(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100 && isRunning; i++) {
try {
Thread.sleep(200);
Message m = handler.obtainMessage(0, 1);// 1为message传递的add值
handler.sendMessage(m);//向handler发送消息
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}

@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
isRunning = false;
}

}
2、Runnable对象的post例子:

import android.R;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.ProgressBar;

public class ExpThreader extends Activity {
private ProgressBar pBar;
private Handler handler;
private Boolean isRunning = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
lp.setMargins(10, 10, 10, 10);
pBar = new ProgressBar(this, null, R.attr.progressBarStyleHorizontal);
pBar.setProgress(0);
pBar.setMax(50);
layout.addView(pBar, lp);
setContentView(layout);
isRunning = true;
handler = new Handler();
new Thread() {

@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100 && isRunning; i++) {
try {
Thread.sleep(200);
handler.post(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
pBar.incrementProgressBy(1);
}
});
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}.start();
}

@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
isRunning = false;
}
}
两个例子的效果是一样的,如图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: