Android 下载网络图片并显示到本地

 更新时间:2017年03月31日 08:42:54   作者:玉杰365  
本文主要介绍了Android实现下载网络图片并显示到本地功能的示例代码。具有很好的参考价值,下面跟着小编一起来看下吧

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();
 }
 });
}
}

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

相关文章

  • Android帧率监测与优化技巧

    Android帧率监测与优化技巧

    Android 应用的性能优化是开发过程中至关重要的一环,而帧率(Frame Rate)是评估应用性能的一个关键指标,在本文中,我们将深入探讨如何监测 Android 应用的帧率,以及如何通过代码示例来优化应用的性能,需要的朋友可以参考下
    2023-10-10
  • Android开发教程之shape和selector的结合使用

    Android开发教程之shape和selector的结合使用

    shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector,接下来通过本文给大家介绍Android开发教程之shape和selector的结合使用,感兴趣的朋友一起学习吧
    2016-01-01
  • android用java和c实现查找sd卡挂载路径(sd卡路径)的方法

    android用java和c实现查找sd卡挂载路径(sd卡路径)的方法

    这篇文章主要介绍了android用java和c实现查找sd卡挂载路径(sd卡路径)的方法,需要的朋友可以参考下
    2014-02-02
  • Android系统状态栏定制图标显示逻辑控制

    Android系统状态栏定制图标显示逻辑控制

    这篇文章主要为大家介绍了Android系统状态栏定制图标显示逻辑控制,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Android选项菜单用法实例分析

    Android选项菜单用法实例分析

    这篇文章主要介绍了Android选项菜单用法,以完整实例形式较为详细分析了Android选项菜单的布局及功能实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • Android ActionBarActivity设置全屏无标题的方法总结

    Android ActionBarActivity设置全屏无标题的方法总结

    这篇文章主要介绍了Android ActionBarActivity设置全屏无标题的相关资料,需要的朋友可以参考下
    2017-07-07
  • Android scrollTo和scrollBy方法使用解析

    Android scrollTo和scrollBy方法使用解析

    在一个View中,系统提供了scrollTo、scrollBy两种方式来改变一个View的位置,下面通过本文给大家介绍Android scrollTo和scrollBy方法使用解析,需要的朋友参考下吧
    2018-01-01
  • 深入理解Kotlin的泛型系统

    深入理解Kotlin的泛型系统

    Kotlin 泛型即 “参数化类型”,将类型参数化,可以用在类,接口,方法上。下面 这篇文章主要给大家介绍了关于Kotlin泛型系统的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-12-12
  • Android精灵动画用法实例

    Android精灵动画用法实例

    这篇文章主要介绍了Android精灵动画用法,实例分析了Android动画的相关使用技巧,需要的朋友可以参考下
    2015-06-06
  • 图文详解Flutter单例的实现

    图文详解Flutter单例的实现

    一个类只允许创建一个实例,那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式,下面这篇文章主要给大家介绍了关于Flutter单例的实现方法,需要的朋友可以参考下
    2021-12-12

最新评论