利用AsyncTask从网络上加载图片

  1. 效果图:

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,它仅仅对带有ProgressBarDialog有作用。修改这个属性为false后可以实时更新进度条的进度。
  setCancelable:设置ProgressDialog 是否可以按返回键取消;

CancelListner:当前Dialog强制取消之后将会被执行,通常用来清理未完成的任务。
  setButton:设置ProgressDialog 的一个Button(需要监听Button事件);
  show:显示ProgressDialog





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值