Android子线程不允许更改UI,为此有几种解决方案,其中比较简单的有Handler和AsyncTask,以下是异步下载图片更新UI的Demo
public class MainActivity extends Activity {
ImageView show;
Button load;
ProgressDialog dialog;
String path="http://avatar.csdn.net/D/8/8/1_bttiyotogmail.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show=(ImageView)findViewById(R.id.show);
load=(Button)findViewById(R.id.load);
dialog=new ProgressDialog(this);
dialog.setTitle("下载");
dialog.setMessage("正在下载...");
//设置ProgressDialog的样式为水平
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
load.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
new MyTask().execute(path);
}
});
}
// Params 启动任务执行的输入参数,比如HTTP请求的URL。
// Progress 后台任务执行的百分比。
// Result 后台执行任务最终返回的结果,比如String,Bitmap
public class MyTask extends AsyncTask<String, Integer, Bitmap>{
@Override//实际下载任务
protected Bitmap doInBackground(String... params) {
Bitmap bitmap=null;
InputStream inputStream = null;
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
try {
HttpClient client=new DefaultHttpClient();
HttpGet get=new HttpGet(params[0]);
HttpResponse response=client.execute(get);
Log.e("Tag", "!!!");
if (response.getStatusLine().getStatusCode()==200) {
inputStream=response.getEntity().getContent();
long length = response.getEntity().getContentLength();
byte[] data =new byte [1024];
int temp=0;
int total_length = 0;
while((temp=inputStream.read(data))!=-1){
total_length+=temp;
int value = (int)((total_length/(float)length)*100);
publishProgress(value);
outputStream.write(data,0,temp);
}
byte[] result= outputStream.toByteArray();
bitmap=BitmapFactory.decodeByteArray(result, 0, result.length);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
try {
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return bitmap;
}
@Override//下载结束
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
dialog.dismiss();
show.setImageBitmap(result);
Log.e("Tag", "Over!!!");
}
@Override//下载更新
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
dialog.setProgress(values[0]);
}
@Override//显示进度条
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
dialog.show();
}
}
}