标签:开始 instance ges xtend XML src ini 定义 ogre
耗时操作和更新UI结合,以前用过Handler。就是新开线程,处理耗时操作,然后通过发送信息,Handler在UI线程更新UI。
Android提供一个已经封装好的类AsyncTask,我们只需重写它的几个方法就行。
//在execute(Params... params)被调用后立即执行,在doInBackground之前调用,UI线程 onPreExecute() //当doInBackground结束时,此方法将会被调用,UI线程 onPostExecute(Object o) //用于更新UI onProgressUpdate(Object[] values) //耗时操作,在执行过程中可以调用publishProgress来更新进度信息 doInBackground(Object[] params)
下面是一个例子。
在MainActivity里面实例化一个自定义AsyncTask,然后开始执行。
这个自定义的AsyncTask每隔5s使进度条增加10%
布局文件(一个TextView,一个Button,一个进度条)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.test.MainActivity">
<TextView
android:id="@+id/textView01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<ProgressBar
android:id="@+id/progressBar02"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_below="@+id/textView01"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="56dp" />
<Button
android:id="@+id/button03"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="更新progressbar"
android:layout_marginTop="133dp"
android:layout_below="@+id/textView01"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>

自定义的AsyncTask
public class ProgressBarAsyncTask extends AsyncTask {
private TextView textView;
private ProgressBar progressBar;
public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) {
super();
this.textView = textView;
this.progressBar = progressBar;
}
//在execute(Params... params)被调用后立即执行,在后台操作之前调用,UI线程
@Override
protected void onPreExecute() {
textView.setText("开始执行异步线程");
}
//当后台操作结束时,此方法将会被调用,UI线程
@Override
protected void onPostExecute(Object o) {
textView.setText("异步操作执行结束");
}
//用于更新UI
//有个很奇怪的问题 如果改了系统默认的参数,会导致调用失败,所以只能在这里面做一下类型转换
//就是不能重载吧
@Override
protected void onProgressUpdate(Object[] values) {
int temp = Integer.parseInt(values[0]+"");
Log.d("TAG",temp+"");
progressBar.setProgress(temp);
}
//后台做的事情,耗时操作,在执行过程中可以调用publishProgress(Progress... values)来更新进度信息
@Override
protected Object doInBackground(Object[] params) {
//5s加载10%
for(int i=1;i<=10;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("TAG",i+"");
//在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行
publishProgress(i*10);
}
return null;
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
private Button button;
private ProgressBar progressBar;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.button03);
progressBar = (ProgressBar)findViewById(R.id.progressBar02);
textView = (TextView)findViewById(R.id.textView01);
progressBar.setMax(100);
progressBar.setProgress(0);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ProgressBarAsyncTask asyncTask = new ProgressBarAsyncTask(textView, progressBar);
asyncTask.execute();
}
});
}
}
效果


标签:开始 instance ges xtend XML src ini 定义 ogre
原文地址:http://www.cnblogs.com/wzben/p/6067506.html