很多时候编写android请求网络都用到了handler和messager,比如:文件下载。为了实现代码的复用性,在网上找了些资料,写了一个工具类:
public class DownloadTools {
private ProgressDialog dialog;
public DownloadTools(Context context) {
dialog = new ProgressDialog(context);
dialog.setTitle("提示信息");
dialog.setMessage("正在加载数据...");
}
public void loadData(final String path, final DownloadCallBack downloadCallBack) {
final Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
byte[]data=(byte[])msg.obj;
//回调接口
downloadCallBack.loadCallBack(data);
if(msg.what==1){
dialog.dismiss();
}
}
};
class MyThread implements Runnable{
@Override
public void run() {
HttpClient httpClient=new DefaultHttpClient();
HttpPost httpPost=new HttpPost(path);
try {
HttpResponse httpResponse=httpClient.execute(httpPost);
if(httpResponse.getStatusLine().getStatusCode()==200){
byte[]data=EntityUtils.toByteArray(httpResponse.getEntity());
Message message=Message.obtain();
message.obj=data;
message.what=1;
handler.sendMessage(message);
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
httpClient.getConnectionManager().shutdown();
}
}
}
//开启子线程下载
new Thread(new MyThread()).start();
dialog.show();
}
//回调接口
public interface DownloadCallBack {
public void loadCallBack(byte[] data);
}
}
在activity中使用如下:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_handler:
//new Thread(new HandlerThread()).start();
//dialog.show();
DownloadTools tools=new DownloadTools(MainActivity.this);
tools.loadData(url, new DownloadCallBack() {
@Override
public void loadCallBack(byte[] data) {
Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);
iv_handler.setImageBitmap(bitmap);
}
});
break;
case R.id.handler_pb:
new Thread(new HandlerProgBarThread()).start();
dialog.show();
break;
}
}