线程之间的数据传输之AsyncTask

来源:互联网 发布:磁贴数据库已损坏 编辑:程序博客网 时间:2024/05/18 00:17

1.底层仍然是通过Handler来实现线程通讯

2.用AsyncTask的好处在于代码更加清晰,便于管理和维护

3.提供了线程池(预加载许多线程)节省了时间,线程池是静态的

private static final BlockingQueue<Runnable> sPoolWorkQueue =            new LinkedBlockingQueue<Runnable>(128);

多个AsyncTask对象共用一个线程池

4.使用AsyncTask不用写flag来结束子线程


代码:

public class MainActivity extends Activity {private TextView tv_txt;private MyAsyncTask task;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv_txt=(TextView) findViewById(R.id.tv_txt);//创建自定义AsyncTask对象task=new MyAsyncTask();//执行任务//传入的参数供doInBackground使用task.execute("http://www.baidu.com");}/** * 这里的三个泛型依次对应 * 第一个String对应doInBackground的可变参数String... params * Integer对应onProgressUpdate的可变参数Integer... values * 第二个String对应onPostExecute的参数String result * */private class MyAsyncTask extends AsyncTask<String,Integer,String> {/** * 主线程调用,在doInBackground之前执行 * */@Overrideprotected void onPreExecute() {//通常用于弹加载对话框Log.d("ein", "onPreExecute");}/** * 子线程调用,在onPreExecute之后执行 * 返回的值作为参数传入onPostExecute方法 * */@Overrideprotected String doInBackground(String... params) {Log.d("ein","正在请求:"+params[0]);try {//模拟网络请求for(int i=1;i<=100;i++){Thread.sleep(1000);Log.d("ein",i+"");//推送进度信息//该方法会去调用onProgressUpdate方法publishProgress(i);}String str="需要被传输的数据";return str;} catch (InterruptedException e) {e.printStackTrace();}return null;}/** * 主线程调用,在doInBackground之后执行 * */@Overrideprotected void onPostExecute(String result) {Log.d("ein", "onPostExecute");tv_txt.setText(result);//关闭加载对话框}/** * 主线程调用,更新进度时调用 * */@Overrideprotected void onProgressUpdate(Integer... values) {tv_txt.setText(values[0]+"%");}}@Overrideprotected void onDestroy() {super.onDestroy();//AsyncTask中的cancel方法实现了结束子线程,//所以不需要像handler那样写flagtask.cancel(true);}}






0 0
原创粉丝点击