Android:异步任务AsyncTask、execute、publishProgress、onProgressUpdate


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
public  class  MainActivity  extends  Activity  implements  OnClickListener
{
       
     private  TextView textView;
     private  ProgressBar progressBar;
       
     class  MyAsyncTask  extends  AsyncTask<String, Integer, String>
     {
         /**
          * 异步任务:AsyncTask<Params, Progress, Result>:只能子线程发消息到main线程
          * 1.Params:UI线程传过来的参数。可变参数影响asyncTask.execute()和doInBackground().
          * 2.Progress:发送消息的类型。可变参数影响onProgressUpdate()和publishProgress().
          * 3.Result:返回结果的类型。耗时操作doInBackground的返回结果传给执行之后onPostExecute的参数类型。
          *
          * 执行流程:
          * 1.onPreExecute()
          * 2.doInBackground()-->onProgressUpdate()
          * 3.onPostExecute()
          */
         @Override                     
         protected  void  onProgressUpdate(Integer... values) //执行操作中,发布进度后
         {
             progressBar.setProgress(values[ 0 ]); //每次更新进度条
         }
         @Override //实心三角:重写父类方法
         protected  void  onPreExecute() //执行之前
         {
             progressBar.setVisibility(View.VISIBLE); //点击之后,下载执行之前,设置进度条可见
         }
           
         @Override //空心三角:实现父类方法
         protected  String doInString...  params) //执行耗时操作
         {
             //在此方法执行耗时操作,耗时操作中发布进度,更新进度条
             //String result = download();
             for  ( int  i =  0 ; i <  10 ; i++)
             {
                 try
                 {
                     Thread.sleep( 1000 );
                     publishProgress(i *  10 ); //进度条每次更新10%,执行中创建新线程处理onProgressUpdate()
                 }
                 catch  (InterruptedException e)
                 {
                     e.printStackTrace();
                 }  
             }
             return  "下载完成!" ;
         }
           
         @Override
         protected  void  onPostExecute(String result) //执行之后
         {
             //在此方法执行main线程操作
             progressBar.setVisibility(View.GONE); //下载完成后,隐藏进度条
             textView.setText(result);
         }
     }
     @Override
     protected  void  onCreate(Bundle savedInstanceState)
     {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
           
         findViewById(R.id.button1).setOnClickListener( this );
         textView = (TextView) findViewById(R.id.textView1);
         progressBar = (ProgressBar) findViewById(R.id.progressBar1);
     }
       
     @Override
     public  boolean  onCreateOptionsMenu(Menu menu)
     {
         getMenuInflater().inflate(R.menu.activity_main, menu);
         return  true ;
     }
     @Override
     public  void  onClick(View v)
     {
         switch  (v.getId())
         {
         case  R.id.button1:
             btnClick();
             break ;
           
         default :
             break ;
         }
     }
     private  void  btnClick() //创建AsyncTask对象,执行任务
     {
         MyAsyncTask asyncTask =  new  MyAsyncTask();
         asyncTask.execute( "http://www.google.com" );
         //可以通过此处传参数给AsyncTask,execute方法只能在UI线程里使用
     }
     private  String download() //下载,耗时操作
     {
         try
         {
             Thread.sleep( 3000 );
         }
         catch  (InterruptedException e)
         {
             e.printStackTrace();
         }
         return  "下载完成!" ;
     }
}




本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1208441,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值