IvesChan

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

当一个程序第一次启动时,Android会同时启动一个对应的主线程,这个主线程称为UI线程,

该线程主要负责处理与UI相关的事件,从网络上接受数据的时候,一般都要再开启一个线程来完成,

但子线程有不能更新控件,让网络上的数据显示在控件上;Android提供了有几种方法,其中使用

频率较高的是Handler机制,但这个代码有时也很复杂很难理解。

Android1.5之后提供了一个工具类AsnycTask:

  AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
  Params 启动任务执行的输入参数,比如HTTP请求的URL;
  Progress 后台任务执行的百分比;
  Result 后台执行任务最终返回的结果,比如String;

  1) 子类化AsyncTask
  2) 实现AsyncTask中定义的下面一个或几个方法

  onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。

  doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用publishProgress方法来更新实时的任 务进度。该方法是抽象方法,子类必须实现。

  onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。

  onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread。

 

例子:

public class LuanQiBaZaoActivity extends Activity {
    private Button button;
    private TextView progress;
    private TextView kk;
    private ProgressBar bar;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        button = (Button) findViewById(R.id.download);
        kk = (TextView) findViewById(R.id.kk);
        progress = (TextView) findViewById(R.id.progress);
        bar = (ProgressBar) findViewById(R.id.progressBar1);
        button.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                new downloadPro().execute(100);
            }
        });
        
        
    }
    
    class downloadPro extends AsyncTask<Integer, Integer, String> {
        @Override
        protected void onPostExecute(String result) {       //当doInBackground执行完的时候,这个方法会被调用,result是doInBackground返回的数据
            kk.setText(result);
            super.onPostExecute(result);
        }

        @Override
        protected void onPreExecute() {     //第一次被调用,可用来初始化控件
            bar.setVisibility(View.VISIBLE);
            super.onPreExecute();
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            progress.setText(values[0] + "%");
            super.onProgressUpdate(values);
        }

        @Override
        protected String doInBackground(Integer... arg0) {     //后台调用,可用来执行消耗时间较长的,如下载
            
            for(int i=0; i<100; i++) {
                bar.setProgress(i);
                publishProgress(i);                    //一旦这个方法被调用,onProgressUpdate这个方法会被调用
                
                try {
                    Thread.sleep(arg0[0]);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "执行完毕";
        }
        
    }
}

 

 

posted on 2012-02-14 18:09  IvesChan  阅读(91)  评论(0)    收藏  举报