- 效果图:
package com.example.httppicture;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText text ;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text =(EditText) this.findViewById(R.id.page);
imageView = (ImageView) this.findViewById(R.id.imageView);
Button button = (Button) this.findViewById(R.id.button);
button.setOnClickListener(new DisplayContent());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class DisplayContent implements OnClickListener
{
@Override
public void onClick(View v)
{
String pageAddress = text.getText().toString();
if( null == pageAddress ||"".equals(pageAddress))
{
Toast.makeText(MainActivity.this, "请输入图片的连接", 1).show();
return;
}
//开始执行AsyncTask,并传入某些数据
LongTimeTask task = new LongTimeTask(MainActivity.this);
task.execute(pageAddress);
}
}
private class LongTimeTask extends AsyncTask<String, Integer , byte[]>
{
private ProgressDialog pdialog;
public LongTimeTask(Context content) {
super();
pdialog = new ProgressDialog(content, 0);
pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pdialog.setButton(ProgressDialog.BUTTON_POSITIVE,"cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
// 但进度条取消后,做一些处理
pdialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
Toast.makeText(MainActivity.this, R.string.error, 1).show();
}
});
pdialog.setTitle("提示");
pdialog.setMessage("正在加载");
pdialog.setCancelable(true);
pdialog.setIndeterminate(false);
pdialog.setMax(100);
pdialog.show();
}
@Override
protected byte[] doInBackground(String... params)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try
{
// 获取某个网站的二进制数据
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(params[0]);
// params[0]代表连接的url
HttpResponse response = client.execute(get);
HttpEntity entity = response.getEntity();
long length = entity.getContentLength();
InputStream is = entity.getContent();
BufferedInputStream bis = new BufferedInputStream(is);
int len =0;
byte[] buffer = new byte[1024];
int count =0;
while( (len = bis.read(buffer)) != -1)
{
baos.write(buffer, 0, len);
count += len;
if( len > 0)
{
// 如果知道响应的长度,调用publishProgress()更新进度
publishProgress( (int)( (count/(float)length)*100 ) );
}
if( isCancelled() )
break;
}
baos.close();
//返回内容
}
catch(Exception e)
{
Toast.makeText(MainActivity.this, R.string.nothing, 1).show();
throw new RuntimeException(e);
}
return baos.toByteArray();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
pdialog.setProgress(values[0]);
}
@Override
protected void onPostExecute(byte[] result)
{
//更新UI的操作,这里面的内容是在UI线程里面执行的
Bitmap bitmp = BitmapFactory.decodeByteArray(result, 0, result.length);
imageView.setImageBitmap(bitmp);
pdialog.dismiss();
}
}
}
ProgressDialog对象介绍
当然这里同样使用了线程来控制进度条显示,另外可以使用以下方法来设置ProgressDialog。
setProgressStyle:设置进度条风格,风格为圆形,旋转的。
setTitlt:设置ProgressDialog 标题
setMessage:设置ProgressDialog提示信息;
setIcon:设置ProgressDialog标题图标;
setIndeterminate:设置ProgressDialog 的进度条是否不明确; 这个属性对于ProgressDailog默认的转轮模式没有实际意义,默认下设置为true,它仅仅对带有ProgressBar的Dialog有作用。修改这个属性为false后可以实时更新进度条的进度。
setCancelable:设置ProgressDialog 是否可以按返回键取消;
CancelListner:当前Dialog强制取消之后将会被执行,通常用来清理未完成的任务。
setButton:设置ProgressDialog 的一个Button(需要监听Button事件);
show:显示ProgressDialog。