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>