您的位置:首页 > 理论基础 > 计算机网络

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

2014-10-30 00:00 405 查看
摘要: 使用异步操作从网络上下载图片,并显示到手机屏幕上

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" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: