Android中从网络上异步下载图片并显示到手机屏幕上

1.直接上核心部分的代码:

private ImageView image;//获得对象控件
 private Bitmap bm;
 private ProgressDialog dialog = null;

image = (ImageView) findViewById(R.id.imageView1);

 

//获得从网络上得到的图片
 private Bitmap getImageBitmap(String url) {
  // TODO Auto-generated method stub
  URL imageurl = null;
  Bitmap bitmap = null;
  try {
   imageurl = new URL(url);
   HttpURLConnection con = (HttpURLConnection) imageurl
     .openConnection();
   con.setDoInput(true);
   con.connect();
   InputStream is = con.getInputStream();
   bitmap = BitmapFactory.decodeStream(is);
   is.close();
  } catch (MalformedURLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return bitmap;
 }

//  异步下载网络中的图片使用AsyncTack(Params, Progress, Result)
 // AsyncTask称为异步操作方法,最不好掌握,但是是官方推荐的方法,使用该方法是要记得三个泛型参数的含义,以及参数对应的各个方法
 // 1.第一个泛型 Params 对应的函数为doInBackground(Params)该泛型一般使用的形式为数组的形式Params[0]
 // 该泛型同时也是MyTask对象调用execute(Params)方法时所用的参数,一般为URL或ip地址
 // 2.第二个泛型 Progess 对应的函数为onProgressUpdate(Progess)该泛型使用的形式一般为数组的形式
 // Progress[0]用于控制事件的进度情况
 // 3.第三个泛型 Result 对应的函数为onPostExecute(Result)
 // 该泛型为doInBackground()函数执行后的返回结果,图片为Bitmap 文件为String
 // 使用异步操作的时候对应的泛型和对应的函数一定要对照 要不容易出错,三个泛型也可能都为String
 private class MyTask extends AsyncTask<String, Integer, Bitmap> {
  // 异步操作中方法的执行顺序--第一步
  // 该方法是用于异步操作前ui的工作准备,该方法运行在ui线程中
  @Override
  protected void onPreExecute() {
   // TODO Auto-generated method stub
   super.onPreExecute();
   // 进度条对话框,对ui控件的操作都是运行在ui线程当中的
   dialog = ProgressDialog.show(WelcomeActivity.this, "", "wait...",
     true, true);
  }

  // 异步操作中方法的执行顺序--第二步
  // 该方法主要是处理耗时或可能产生阻塞的操作, 必须运行在非ui线程中
  // 函数类型为返回结果的类型必须要一致 注意参数的形式数组形式
  @Override
  protected Bitmap doInBackground(String... params) {
   bm = getImageBitmap(params[0]);// params一般只用为数组的形式Params[0]
   // 异步操作中方法的执行顺序--第三步
   // 在doInBackground方法中一般会调用publishProgress方法,用于更新事件的进行情况,进度条进度的变化
   // publishProgress函数的参数
   // 既然是对进度条的控制,那么该方法的参数形式与onProgressUpdate方法的参数形式是一致的
   // publishProgress(values);
   return bm;
  }

  // //异步操作中方法的执行顺序--第四步
  // 应该是运行在ui线程中 对进度条的控制 设置进度条的变化情况
  @Override
  protected void onProgressUpdate(Integer... values) {
   // TODO Auto-generated method stub
   super.onProgressUpdate(values);
  }

  // 异步操作中方法的执行顺序--第五步
  // 运行在ui线程中,对ui页面进行操作 可以在该方法中定义控件的表现形式
  @Override
  protected void onPostExecute(Bitmap bitmap) {
   // 更新UI的操作,这里面的内容是在UI线程里面执行的

   image.setImageBitmap(bm);
   dialog.dismiss();
   Intent i = new Intent(WelcomeActivity.this, LoginActivity.class);
   startActivity(i);
   WelcomeActivity.this.finish();
  }

 }

2.调用这部分代码可以直接运行

String url = "http://196.168.41.91:80/server/girl.png";//这里是本机的服务器地址要修改才有效
   MyTask task = new MyTask();// 生成对象
   task.execute(url); // 执行该方法在后台进行操作

3.在xml布局文件中定义一个ImageView控件即可

4.只要涉及到网络别忘了添加相应的权限

 <uses-permission android:name="android.permission.INTERNET" />

你可能感兴趣的:(Android中从网络上异步下载图片并显示到手机屏幕上)