Android下载网络图片的流程是:

发送网络请求->将图片以流的形式下载下来->将流转换为Bitmap并赋给ImageView控件。

注意点

最新的Android系统不可以在主线程上请求网络,需要使用线程来请求

下载图片属于耗时任务,最优做法是放在一个AsyncTask中操作

设计思路

1.网络请求:该例中需要下载的文件类型是图片类型,可以将网络请求获取的数据类型转换为Bitmap已供ImageView直接使用,但是一个合理的网络请求类的设计是将下载的数据类型转换为最基本的InputStream,这样不管是下载图片,音频,文本还是视频,都可以将结果抛出去让上层的逻辑来处理。

2.异步请求:下载图片,网络下载属于耗时操作,所以需要封装一个AsyncTask来处理网络请求,该请求继承自Runnable接口。

3.异步回调:前台需要通过回调的方式来得到图片源,并将该图片源赋值给ImageView.

相关代码

NetService:网络请求服务类

public class NetService {

public static InputStream getInputStreamByUrl(String address){

URL url = null;

HttpURLConnection urlConnection = null;

try {

url = new URL(address);

urlConnection = (HttpURLConnection) url.openConnection();

urlConnection.setConnectTimeout(2 * 1000);

urlConnection.setRequestMethod("GET");

return urlConnection.getInputStream();

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

}

NetServiceTask:AsyncTask类

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.os.AsyncTask;

import java.io.BufferedInputStream;

import java.io.InputStream;

public class NetServiceTask extends AsyncTask

public NetServiceTask(String address,URLPostHandler urlPostHandler) {

this.address=address;

this.urlPostHandler=urlPostHandler;

}

/**

* 表示任务执行之前的操作

*/

@Override

protected void onPreExecute() {

// TODO Auto-generated method stub

super.onPreExecute();

}

/**

* 主要是完成耗时的操作

*/

@Override

protected Bitmap doInBackground(String... arg0) {

InputStream inputStream=NetService.getInputStreamByUrl(arg0[0]);

if(inputStream!=null){

return BitmapFactory.decodeStream(new BufferedInputStream(inputStream));

}

return null;

}

/**

* 主要是更新UI的操作

*/

@Override

protected void onPostExecute(Bitmap result) {

// TODO Auto-generated method stub

super.onPostExecute(result);

if(this.urlPostHandler!=null&&result!=null){

this.urlPostHandler.PostHandler(result);

}

}

@Override

public void run() {

execute(this.address);

}

}

URLPostHandler:回调接口

public interface URLPostHandler {

void PostHandler(Bitmap bitmap);

}

前台请求图片并显示到ImageView

public class MainActivity extends AppCompatActivity {

Button buttonDownload;

ImageView imageViewImg;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

buttonDownload = (Button) findViewById(R.id.buttonDownload);

imageViewImg = (ImageView) findViewById(R.id.imageViewImg);

buttonDownload.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

String address = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1490783056273&di=6160d101d31dcf5f44b443ad9c5b2648&imgtype=0&src=http%3A%2F%2Fimg.sc115.com%2Fuploads%2Fallimg%2F110626%2F2011062622383898.jpg";

NetServiceTask netServerTask= new NetServiceTask(address,new URLPostHandler() {

@Override

public void PostHandler(Bitmap bitmap) {

imageViewImg.setImageBitmap(bitmap);

}

});

Thread thread=new Thread(netServerTask);

thread.start();

}

});

}

}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持编程小技巧!

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐