耗时操作和更新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(); } }); } }
效果