所有的问题,我都希望能从书本中找到理论的支撑。我的学习方法,爱读书!
学习完视频后,我们还可以再参考《疯狂Android讲义(第二版)》 2.6.1 进度条,3.5 Handler消息传递机制。事半功倍!
33.1 进度条ProgressBar
一个可视化的进度指示器,代表正在执行的耗时任务,可以为用户展示一个进度条,表示正在执行的任务的进度。
当程序不能或者不需要确定任务执行的准确进度时,progressBar也可以只显示一个无限循环的圆圈。
<ProgressBar
android:id="@+id/progressBar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
默认情况下:progressBar显示的是一个无线循环的圆圈。也可以通过样式的配置 实现一个水平方向的进度条。
style=”@android:style/Widget.ProgressBar.Horizontal”
设置style的方式有如下这么多
Widget.ProgressBar.Horizontal
Widget.ProgressBar.Small
Widget.ProgressBar.Large
Widget.ProgressBar.Small.Inverse
Widget.ProgressBar.Large.Inverse
如下是一个长型进度条,并让宽度match 父窗口,更好看一些。
<ProgressBar
android:id="@+id/progressBar1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar.Horizontal"
android:max="100"
android:progress="29"
/>
我们实现一个动态调节进度条进度。
progressBar.incrementProgressBar(10);
progressBar.incrementProgressBar(-10); 传个负值,就是减。
33.2 UI主线程的阻塞
举了一个例子,当button方法sleep的时候,主UI线程,例如无线循环progress会卡主。
而解决方法是使用多线程解决。见如下修改,但如下方法无法修改view。
public void test(View v){
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
33.3 消息队列处理器Handler
Handler主要用于异步消息的处理
注意:1. Handler对象的实例化,要在UI线程当中完成。
调用handler的post方法可以为UI线程的消息队列添加一个Runnable消息。
如果要更新UI组件,就需要使用post
package com.example.test_progressbar2;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.support.v4.app.NavUtils;
public class MainActivity extends Activity {
//如下是一个错误例子,会造成空指针。一定是在onCreate函数中赋值。
//private ProgressBar pb = (ProgressBar) findViewById(R.id.progressBar1);
private ProgressBar pb ;
private Handler hd = new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pb =(ProgressBar) findViewById(R.id.progressBar1);
/* sleep 6 秒,然后删除进度条,并弹出提示信息,下载完毕。
*/
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
hd.post(new Runnable(){
public void run() {
// TODO Auto-generated method stub
ViewGroup group =(ViewGroup) pb.getParent();
//如果把如下操作,放到UI主线程中,就会弹出错误,crash!!
group.removeView(pb);
TextView tv = new TextView(MainActivity.this);
tv.setText("下载成功");
group.addView(tv);
}
});
}}).start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}