熟悉Android---使用imageView加载网络图片

Posted 刘程佳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了熟悉Android---使用imageView加载网络图片相关的知识,希望对你有一定的参考价值。

补充

使用Glide框架只要一行代码就可以搞定图片的显示,功能更强大。都2022年了,有好用的框架那必须要用啊。Glide框架使用请移步至郭霖大神的博客:
https://blog.csdn.net/guolin_blog/article/details/53759439

前言

android 4.0 以后的版本,UI线程不允许有耗时操作,所以请求网络图片需要运行在子线程;

加载图片的代码参考:
https://zhidao.baidu.com/question/537762079.html

效果图

(待补充)

图片链接:

https://img-home.csdnimg.cn/images/20201124032511.png

示例图片:

布局文件

MainActivity.xml

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/img1"/>
                
</LinearLayout>

整体思路

第一步:
在UI线程定义 网络图片链接;
第二步:
新建子线程请求图片,请求结果为bitmap;
第三步:
在UI线程将图片加载出来;

MainActivity.java

public class MainActivity extends Activity 

    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = findViewById(R.id.img1);

        URL url = null;
        try 
            url = new URL("https://img-home.csdnimg.cn/images/20201124032511.png");
            requestImg(url);
         catch (Exception e) 
            e.printStackTrace();
        
    

    private void requestImg(final URL imgUrl)
    
        new Thread(new Runnable() 
            @Override
            public void run() 
                Bitmap bitmap = null;
                try 
                    bitmap = BitmapFactory.decodeStream(imgUrl.openStream());

                    showImg(bitmap);
                 catch (IOException e) 
                    e.printStackTrace();
                
            
        ).start();
    
    private void showImg(final Bitmap bitmap)
        runOnUiThread(new Runnable() 
            @Override
            public void run() 
                imageView.setImageBitmap(bitmap);
            
        );
    

联想

第一步和第二应该可以合并在子线程中;
将bitmap声明为全局变量,第三步应该可以精简:

 try 
            url = new URL("https://img-home.csdnimg.cn/images/20201124032511.png");
            requestImg(url);
         catch (Exception e) 
            e.printStackTrace();
        
 imageView.setImageBitmap(bitmap);

这里我没有测试过,只是一些想法;

权限

在 Mainfest.xml文件中加入网络权限申请;

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

安卓 9 加强了保密性,导致无法进行非加密的 http 网络请求

解决方法:

在 AndroidManifest.xml 的 application 标签中新加:

android:usesCleartextTraffic=“true”

重新运行即可;

Android studio 使用 ImageView 加载 gif 文件

使用一个开源的图片加载和缓存的第三方框架 Android Glide 。

一、首先下载相应的 jar 包。

https://github.com/bumptech/glide/releases/download/v3.6.0/glide-3.6.0.jar

将 jar 包放进 libs 文件夹中,再导进工程中。

二、将 gif 文件放进 drawable 文件夹中

三、再 layout 中加入以下代码

    <ImageView
        android:id="@+id/welcome_gif"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY"/>

其中,

 android:scaleType="fitXY"

 是为了适应屏幕,充满整个屏幕,android:scaleType 还有很多其他取值。

 四、相应的 Activity 中,在onCreate 中加入以下代码

        ImageView welcome_gif = (ImageView) findViewById(R.id.welcome_gif);
        Glide.with(this).load(R.drawable.welcome_mutouren).into(welcome_gif);

 

 其中,R.id.welcome_gif 是 ImageView 的 id 号;R.drawable.welcome_mutouren 是放入的gif 文件

 (图片来自 ui 中国)

 

 

 博客参考:https://blog.csdn.net/zhangphil/article/details/45535693

 

下面的内容与主题无关了,只是实现这个欢迎加载界面时的一些记录。

一、停留在欢迎页面一定的时间。

  在相应的 Activity 的 onCreate() 方法中加入以下代码

        Timer timer=new Timer();
        TimerTask timerTask=new TimerTask() {
            @Override
            public void run() {
                startActivity(intent);
            }
        };

        timer.schedule(timerTask,2000);//此处的Delay可以是2*1000,代表两秒

 

    Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。
    TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。

    用Timer线程实现和计划执行一个任务的基础步骤:
    1.实现自定义的TimerTask的子类,run方法包含要执行的任务代码。
    2.实例化Timer类,创建计时器后台线程。
    3.制定执行计划。这里用schedule方法,第一个参数是TimerTask对象,第二个参数表示开始执行前的延时时间
     (单位是milliseconds,这里定义了2000)。还有一种方法可以指定任务的执行时间。

二、从其他页面返回时不会再次执行这个欢迎界面。

  在相应页面中改写 onPause() 方法

    @Override
    protected void onPause(){
        super.onPause();
        finish();
    }

以上是关于熟悉Android---使用imageView加载网络图片的主要内容,如果未能解决你的问题,请参考以下文章

Android ImageView加载超长图片解决方案

Android ImageView 未加载

如何在android studio中检查ImageView是不是已完成加载和图像

Android studio 使用 ImageView 加载 gif 文件

ImageView & 使用第三方库加载网络图

Android 中 FilePath 的 ImageView 加载问题(截断)