这是一个使用Android Thread从网络上异步下载图片,然后在UI中显示出来的简单示例。
package com.example.learn_thread;
import java.io.InputStream;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
private String url = "http://f.hiphotos.baidu.com/image/pic/item/4ec2d5628535e5ddda91d9dd74c6a7efce1b6276.jpg";
private final int MSG_LOAD_SUCCESS = 0;
private final int MSG_LOAD_FAILURE = 1;
private ImageView imageView;
private ProgressDialog progressDialog;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressDialog = new ProgressDialog(this, ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setCancelable(true);
progressDialog.setMessage("Please wait...");
progressDialog.setMax(100);
imageView = (ImageView) findViewById(R.id.imageView1);
button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
progressDialog.setProgress(0);
progressDialog.show();
new Thread() {
@Override
public void run() {
Bitmap bitmap = loadImageFromUrl(url);
if (bitmap != null) {
Message msg = handler.obtainMessage(MSG_LOAD_SUCCESS, bitmap);
handler.sendMessage(msg);
} else {
Message msg = handler.obtainMessage(MSG_LOAD_FAILURE, null);
handler.sendMessage(msg);
}
super.run();
}
}.start();
}
});
}
private Bitmap loadImageFromUrl(String url) {
Bitmap bitmap = null;
try{
InputStream in = new java.net.URL(url).openStream();
bitmap = BitmapFactory.decodeStream(in);
in.close();
}
catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch(msg.what) {
case MSG_LOAD_SUCCESS:
Bitmap bitmap = (Bitmap) msg.obj;
imageView.setImageBitmap(bitmap);
progressDialog.setProgress(100);
progressDialog.setMessage("Image downloading success!");
progressDialog.dismiss();
break;
case MSG_LOAD_FAILURE:
progressDialog.setMessage("Image downloading failure!");
progressDialog.dismiss();
break;
}
super.handleMessage(msg);
}
};
}
因为Android不能在主线程中访问网络,所以访问网络时应开启子线程,但在子线程中不能更新UI,所以需要分发给handler,在handleMessage中根据消息id更新UI。