您的位置:首页 > 产品设计 > UI/UE

Android中子线程更新主线程UI和ProgressBar的应用

2013-10-31 17:13 211 查看
很多情况先都需要开启其他子线程,但子线程又不能直接更新主线的UI,利用handler可以实现这个需求

1、定义一个标识DOWN_FINISH和new 一个handler并重写handleMessage方法

2、在子线程中Message message=Message.obtain();这样比直接new一个Message效率更高,应为进度条是一直刷新,会一直new,而obtain()方式的的解释是A Message object from the global pool.

直接看代码:

public class MainActivity extends Activity implements OnClickListener {

private Button download;
private Button pbBtn;
private EditText et;
private ProgressBar pb;
private static final int DOWN_FINISH = 3;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case DOWN_FINISH:
pb.setVisibility(View.INVISIBLE);
Toast.makeText(MainActivity.this, "下载完成", Toast.LENGTH_SHORT)
.show();
break;
default:
break;
}
};
};

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

pbBtn = (Button) findViewById(R.id.button2);

pb = (ProgressBar) findViewById(R.id.progressBar1);
pb.setVisibility(View.INVISIBLE);

pbBtn.setOnClickListener(this);
}

public void tryLoad() {
new Thread(new Runnable() {
@Override
public void run() {
String url = et.getText().toString().trim();
String newFileName = url.substring(url.lastIndexOf("/") + 1,
url.length());
if (!TextUtils.isEmpty(url)) {
DownloadUtils.download(url, newFileName, "/sdcard/", 10);
}
}
}).start();

}

public void progressBar() {
pb.setVisibility(View.VISIBLE);
final int max = 20;
pb.setMax(max);
new Thread(new Runnable() {
int current = 0;
boolean flag = true;

@Override
public void run() {
while (flag) {
current++;
pb.setProgress(current);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (current >= max) {
flag = false;
Message msg = Message.obtain(handler);
msg.what = DOWN_FINISH;
// 这里是sendMessage方法,而不是自己重写的handleMessage方法
handler.sendMessage(msg);
}
}
}
}).start();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (v == pbBtn) {
progressBar();
}
}
}

效果:

红色区域是 进度条,因为我这初始化时让其不可见,点击 PBTest 显示进度条及进度动画,进度达到最大值时让其不可见
调用的方法是

pb.setVisibility(View.INVISIBLE);

View.VISIBLE
View.INVISIBLE
View.GONE//如果使用这个,其他控件的位置和这个控件不要有联系,否则布局会会乱

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