Handler 和 AsyncTask的小实验

本文参照 http://blog.csdn.net/mylzc/article/details/6736988 和 http://blog.csdn.net/mylzc/article/details/6772129后

写了自己的代码, 和原作者的差不多, 条理很清晰。如果读下面的代码无障碍那么对handler和asynctask的使用自己应该也就会了。

上代码,这个最直白,哈哈:

  1 package com.example.handlertest;
  2 
  3 import org.apache.http.HttpResponse;
  4 import org.apache.http.client.HttpClient;
  5 import org.apache.http.client.methods.HttpGet;
  6 import org.apache.http.impl.client.DefaultHttpClient;
  7 
  8 import android.annotation.SuppressLint;
  9 import android.app.Activity;
 10 import android.graphics.Bitmap;
 11 import android.graphics.BitmapFactory;
 12 import android.os.AsyncTask;
 13 import android.os.Bundle;
 14 import android.os.Handler;
 15 import android.os.Message;
 16 import android.view.Menu;
 17 import android.view.View;
 18 import android.view.View.OnClickListener;
 19 import android.widget.ImageView;
 20 import android.widget.ProgressBar;
 21 import android.widget.TextView;
 22 import android.widget.Toast;
 23 
 24 public class MainActivity extends Activity implements OnClickListener{
 25     
 26     TextView tv1;
 27     TextView tv2;
 28     ImageView iv1;
 29     ImageView iv2;
 30     ProgressBar progressBar;
 31     
 32     private final static int OK = 0;
 33     private final static int BAD = 1;
 34     
 35     private MyHandler myHandler;
 36     private Thread thread;
 37     @Override
 38     protected void onCreate(Bundle savedInstanceState) {
 39         super.onCreate(savedInstanceState);
 40         setContentView(R.layout.activity_main);
 41         init();
 42         
 43     }
 44 
 45     private void init(){
 46         tv1 = (TextView)findViewById(R.id.getpicture);
 47         tv2 = (TextView)findViewById(R.id.getsecpicture);
 48         iv1 = (ImageView)findViewById(R.id.firstPic);
 49         iv2 = (ImageView)findViewById(R.id.secPic);
 50         progressBar = (ProgressBar)findViewById(R.id.progressBar);
 51         
 52         tv1.setOnClickListener(this);
 53         tv2.setOnClickListener(this);
 54         
 55         myHandler = new MyHandler();
 56         
 57     }
 58     @Override
 59     public boolean onCreateOptionsMenu(Menu menu) {
 60         // Inflate the menu; this adds items to the action bar if it is present.
 61         getMenuInflater().inflate(R.menu.activity_main, menu);
 62         return true;
 63     }
 64 
 65     @SuppressLint("HandlerLeak")
 66     @Override
 67     public void onClick(View arg0) {
 68         // TODO Auto-generated method stub
 69         if( arg0 == tv1){
 70             if(thread == null){
 71                 thread = new Thread(runnable);
 72                 thread.start();
 73             }else{
 74                  Toast.makeText(getApplication(), 
 75                          getApplication().getString(R.string.ThreadIsOn), Toast.LENGTH_LONG).show();  
 76             }
 77         }else if(arg0 == tv2){
 78             new MyAsyncTask().execute("http://csdnimg.cn/www/images/csdnindex_logo.gif");
 79         }
 80         else{
 81             ;
 82         }
 83     }
 84     
 85     @SuppressLint("HandlerLeak")
 86     class MyHandler extends Handler{
 87         public void handleMessage(Message msg){
 88             switch(msg.what){
 89             case OK:{
 90                 Toast.makeText(getApplicationContext(), getString(R.string.ok), Toast.LENGTH_SHORT).show();
 91                 iv1.setImageBitmap((Bitmap)msg.obj);
 92             }break;
 93             case BAD:{
 94                 Toast.makeText(getApplicationContext(), getString(R.string.bad), Toast.LENGTH_SHORT).show();
 95             }break;
 96             default:{
 97                 
 98             }break;
 99             }
100         }
101     }
102     
103     Runnable runnable = new Runnable() {
104         public void run() {
105             HttpClient hc = new DefaultHttpClient();
106             HttpGet hg = new HttpGet("http://csdnimg.cn/www/images/csdnindex_logo.gif");
107             Bitmap bm = null;
108             try{
109                 HttpResponse hr = hc.execute(hg);
110                 bm = BitmapFactory.decodeStream(hr.getEntity().getContent());
111             }catch(Exception  e){
112                 myHandler.obtainMessage(BAD).sendToTarget();
113                 return;
114             }
115             myHandler.obtainMessage(OK, bm).sendToTarget();
116         }
117     };
118     
119     class MyAsyncTask extends AsyncTask<String, Integer, Bitmap>{
120 
121         protected void onPreExecute () {
122             iv2.setImageBitmap(null);
123             progressBar.setProgress(0);
124         }
125         @Override
126         protected Bitmap doInBackground(String... params) {
127             // TODO Auto-generated method stub
128             publishProgress(20); 
129             HttpClient hc = new DefaultHttpClient();
130             HttpGet hg = new HttpGet("http://csdnimg.cn/www/images/csdnindex_logo.gif");
131             Bitmap bm = null;
132             publishProgress(30);
133             try {  
134                 HttpResponse hr = hc.execute(hg);  
135                 bm = BitmapFactory.decodeStream(hr.getEntity().getContent());  
136             } catch (Exception e) {  
137                 return null;  
138             }  
139             publishProgress(100); 
140             return bm;
141         }
142         
143          protected void onProgressUpdate(Integer... progress) {
144              progressBar.setProgress(progress[0]);
145          }
146 
147          protected void onPostExecute(Bitmap result) {
148              if(result != null) {  
149                  Toast.makeText(getApplicationContext(), "成功获取图片", Toast.LENGTH_LONG).show();  
150                  iv2.setImageBitmap(result);  
151              }else {  
152                  Toast.makeText(getApplicationContext(), "获取图片失败", Toast.LENGTH_LONG).show();  
153              progressBar.setProgress(100);
154          }
155 
156          }
157     }
158 
159 }

下面是我的xml主界面布局:

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     tools:context=".MainActivity" >
 6 
 7     <TextView
 8         android:id="@+id/getpicture"
 9         android:clickable="true"
10         android:layout_width="80dp"
11         android:layout_height="80dp"
12         android:text="@string/getPicture" />
13     <ImageView 
14         android:id="@+id/firstPic"
15         android:contentDescription="csdnlogo"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content"
18         android:layout_below="@id/getpicture"/>
19     <TextView 
20         android:id="@+id/getsecpicture"
21         android:clickable="true"
22         android:layout_width="80dp"
23         android:layout_height="80dp"
24         android:layout_below="@id/firstPic"
25         android:text="@string/getPicture"
26         />
27     <ImageView 
28         android:id="@+id/secPic"
29         android:contentDescription="csdnlogo"
30         android:layout_width="wrap_content"
31         android:layout_height="wrap_content"
32         android:layout_below="@id/getsecpicture"/>
33     
34     <ProgressBar 
35         android:layout_below="@id/secPic"
36         android:id="@+id/progressBar"
37         android:layout_width="fill_parent"
38         android:layout_height="wrap_content" 
39         style="?android:attr/progressBarStyleHorizontal"/>
40 
41 </RelativeLayout>

记得在manifest文件中加上联网权限声明:<uses-permission android:name="android.permission.INTERNET"></uses-permission>

 

posted @ 2013-01-31 19:52  __木头鱼__  阅读(364)  评论(0编辑  收藏  举报