异步操作类AsyncTask(11)

                          消息机制我们已经用的足够熟练了,但是还是觉得美中不足的是就是子线程不能在

主线程UI更新,这样就带来了很多不方便,有没有可以解决这一麻烦的方法呢,有,这里介绍一个异步操作类

AsyncTask

AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.

使用的优点:

简单,快捷

过程可控      

使用的缺点:

在使用多个异步操作和并需要进行Ui变更时,难度加大

AsyncTask定义了三种泛型类型 Params,Progress和Result。

    • Params 启动任务执行的输入参数,比如HTTP请求的URL。
    • Progress 后台任务执行的百分比。
    • Result 后台执行任务最终返回的结果,比如String。
  • doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
  • onPostExecute(Result)  相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
  • 有必要的话你还得重写以下这三个方法,但不是必须的:

    • onProgressUpdate(Progress…)   可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
    • onPreExecute()        这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
    • onCancelled()             用户调用取消时,要做的操作

    使用AsyncTask类,以下是几条必须遵守的准则:

    • Task的实例必须在UI thread中创建;
    • execute方法必须在UI thread中调用;
    • 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
    • 该task只能被执行一次,否则多次调用时将会出现异常;

现在我们使用进度条来实现子线程对主线程UI实时更新

主布局函数:

  <ProgressBar
        android:id="@+id/bar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

 Activity

代码:

public class MainActivity extends Activity {

	private TextView info=null;
	private ProgressBar bar=null;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.info=(TextView)super.findViewById(R.id.info);
		this.bar=(ProgressBar)super.findViewById(R.id.bar);
		ChildUpdate child=new ChildUpdate();
		child.execute(100);//休眠时间
		
	}

	private class ChildUpdate extends AsyncTask<Integer,Integer,String>{
		
		protected void onPostExecute(String result){
			MainActivity.this.info.setText(result);//程序执行完毕
		}

		protected void onProgressUpdate(Integer...progress){//每次程序更新之后的数据
			MainActivity.this.info.setText("当前进度为:"+String.valueOf(progress[0]));
			
		}
		
		
		protected String doInBackground(Integer...params) {
			// TODO Auto-generated method stub
			for(int i=0;i<100;i++){
				MainActivity.this.bar.setProgress(i);
				this.publishProgress(i);//及时更新
				
				try {
					Thread.sleep(100);//每0.1秒增长
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			return "完毕";
			
		}
		
	}
}

 实现效果如下:



 

猜你喜欢

转载自429899791.iteye.com/blog/2208508
今日推荐