Android第七天

来源:互联网 发布:讨鬼传极优化 编辑:程序博客网 时间:2024/05/22 10:55
AsyncTask的代码实现:

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

2、AsyncTask的执行分为四个步骤,每一步都对应一个回调方法(由应用程序自动调用的方法),开发者需要做的就是实现这些方法。 
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 classMainActivity extends Activity {

         private Button button;

         private TextView textView;

         private ImageView iv;

         private int size=0;

 

         @Override

         protected void onCreate(BundlesavedInstanceState) {

                   super.onCreate(savedInstanceState);

                   setContentView(R.layout.activity_main);

                   button=(Button)findViewById(R.id.button1);

                   iv=(ImageView)findViewById(R.id.iv);

                   textView=(TextView)findViewById(R.id.textView1);

                   button.setOnClickListener(newOnClickListener(

                                     ) {

                           

                            @Override

                            public voidonClick(View v) {

                                     newMyTask(MainActivity.this).execute("http://www.baidu.com/img/bdlogo.gif");

 

                            }

                   });

         }

         class MyTask extendsAsyncTask<String,Integer,Bitmap>{

                   private ProgressDialog pd;

                   private Context context;

                   public MyTask(Contextcontext) {

                            this.context=context;

                            pd=new ProgressDialog(context);

                            pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

                            pd.setIcon(R.drawable.ic_launcher);

                            pd.setTitle("提示");

                            pd.setMessage("正在下载,请耐心等待");

                            pd.setProgress(0);

 

                   }

                   //是在doInBackgroud之前执行的,主要是做工作线程之前的准备工作。

                   @Override

                   protected void onPreExecute(){

                            pd.show();

                   }

 

                   @Override

                   protected BitmapdoInBackground(String... params) {

                            Stringpath=params[0];

                            URL url=null;

                            HttpURLConnectionconn=null;

                            ByteArrayOutputStreambos=null;

                            Bitmap bitmap=null;

                           

                            try {

                                     url=newURL(path);

                                     conn=(HttpURLConnection)url.openConnection();

                                     conn.setRequestMethod("GET");

                                     conn.setDoInput(true);

                                     conn.setConnectTimeout(2000);

                                     conn.connect();

                                     intcode=conn.getResponseCode();

                                     intsum=conn.getContentLength();

                                     if(code==200) {

                                     InputStreamis=  conn.getInputStream();

                                     bos=newByteArrayOutputStream();

                                     byte[]b=new byte[2];

                                     int len=-1;

                                     while((len=is.read(b))!=-1) {

                                               bos.write(b,0, len);

                                               bos.flush();

                                               size+=len;

                                               //通知publishProgress

                                               publishProgress((int)(size/(float)sum*100));

 

                                              

                                     }

                                     byte[]v=bos.toByteArray();

                                      bitmap=BitmapFactory.decodeByteArray(v,0,v.length);

                                     }

                                    

                            } catch(MalformedURLException e) {

                                     // TODOAuto-generated catch block

                                     e.printStackTrace();

                            } catch (IOExceptione) {

                                     // TODOAuto-generated catch block

                                     e.printStackTrace();

                            }finally{

                                     conn.disconnect();

                                     try {

                                               bos.close();

                                     } catch(IOException e) {

                                               //TODO Auto-generated catch block

                                               e.printStackTrace();

                                     }

                                    

                            }

                            return bitmap;

                           

                   }

                   @Override

                   protected voidonProgressUpdate(Integer... values) {

                            pd.setProgress(values[0]);

                   }

                   @Override

                   protected voidonPostExecute(Bitmap result) {

                            iv.setImageBitmap(result);

                            pd.dismiss();

                   }

 

                  

                  

         }

 

 

}


0 0
原创粉丝点击