zoukankan      html  css  js  c++  java
  • 用AsyncTask来获取网络图片

    先看下运行结束

    这里有两个Button

    点击第一个Button运行的结果!第一张有一个旋转的灰色圈圈!


    点击第二个Button运行的结果如下:带进度条的


    ok,看下实现方法

    先在配置清单中加一个访问网络的权限!

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

    下面是第一个Button实现效果所使用的方法

    第一步:在image布局中添加控件

       <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/imaged"
        />
        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:layout_centerInParent="true"
            android:id="@+id/progressBar"
    
    
            />
    

    第二步:直接到ImageTeakJava类中来

    public class ImageTeak extends AppCompatActivity {
        private ProgressBar mProgressbar;
        private ImageView mImage;
        private MyAsyncTask task;
        //网络图片地址
        private static String url=
                "http://b365.photo.store.qq.com/psb?/V1112Bib4N2Zv2/yIw4AGwbwoCsuA5Zid.eAEE9YpH0znIsrS4os49LY7M!/c/dG0BAAAAAAAA&bo=OARoBQAAAAAREHY!&rf=mood_app";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.image);
    
            mProgressbar= (ProgressBar) findViewById(R.id.progressBar);
            mImage= (ImageView) findViewById(R.id.imaged);
            //创建一个类
            task =new MyAsyncTask();
            //启动
            task.execute(url);
        }
    
        /** AsyncTask<String,Void,Bitmap>
            第一个参数;为输入的url参数是String类型的
            第二个参数:我们没有进度条所以为Void类型的
            第三个参数;返回的是Bitmap*/
        class MyAsyncTask extends AsyncTask<String,Void,Bitmap>{
    
            @Override
            //第一个会调用的方法
            protected void onPreExecute() {
                // 开始之前要做的准备操作在这里面执行
                super.onPreExecute();
                mProgressbar.setVisibility(View.VISIBLE);//显示进度
            }
    
            @Override
            //第三个会调用的方法。用来展示处理的结果!
            // (当doInBackground方法完成异步处理之后会调用的方法)
            protected void onPostExecute(Bitmap bitmap) {
                super.onPostExecute(bitmap);
                mProgressbar.setVisibility(View.GONE);
                /**
                 * 将doInBackground()方法中
                 * 返回的bitmap解析的图片设置给ImageView
                 * */
                mImage.setImageBitmap(bitmap);
            }
    
            @Override
            //第二个会调用的方法。真正的耗时操作!下载网络图片
            protected Bitmap doInBackground(String... strings) {
                //获取传递进来的参数,取出对应的URL
                String url=strings[0];
                //定义网络连接对象
                URLConnection connection;
                //获取需要的Bitmap
                Bitmap bitmap=null;
                //获取数据的输入流
                InputStream is;
                try {
                    //获取网络连接对象
                    connection=new URL(url).openConnection();
                    //获取输入流
                    is=connection.getInputStream();
                    //包装下
                    BufferedInputStream bis=new BufferedInputStream(is);
                    //设置睡眠三秒
                    Thread.sleep(3000);
                    //通过decodeStream()方法解析输入流将输入流解析成Bitmap图片
                    bitmap= BitmapFactory.decodeStream(bis);
                    //关闭流
                    is.close();
                    bis.close();
                  //捕获异常
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //返回的是解析后的网络图像
                return bitmap;
            }
    
        }
    }
    

    第三步:在activity.xml布局中添加两个 Button

      <Button
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:onClick="loadImage"
           android:text="加载图片"
           />
       <Button
    
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:id="@+id/loadProgress"
           android:onClick="loadProgress"
           android:text="带进度条的获取图片"
           />
    

    第四步:在Mactivity.java中进行编辑

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
           /* MsyncTask task=new MsyncTask();
            task.execute();*/
        }
        public void loadImage(View view){
            Intent intent=new Intent(MainActivity.this,ImageTeak.class);
            startActivity(intent);
        }
        public void loadProgress(View view){
            Intent intent=new Intent(MainActivity.this,ProgressTesk.class);
            startActivity(intent);
        }
    }
    

    OK!点击第一个Button效果的代码写完啦!、

    再看下第第二ButtOn实现效果的代码

    第一步:在progress.xml布局中添加控件

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/imageView"
        />
        <ProgressBar
            android:visibility="gone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleHorizontal"
        android:id="@+id/bar"
        android:layout_centerInParent="true"
        />
    

    第二步:对ProgressTesk.java类进行编辑

    public class ProgressTesk extends AppCompatActivity {
        private ProgressBar bar;
        private MyAsyncTask task;
        private ImageView imageView;
    
        private static String url=
                "http://b389.photo.store.qq.com/psb?/V1112Bib4N2Zv2/0Ahi.ZaLH*i0tsSy3dlWnUNIXOXdYXRbVdwdoUpfxwk!/m/dIUBAAAAAAAAnull&bo=OASgBQAAAAAFB70!&rf=photolist&t=5";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.progress);
            //控件实例化
            bar= (ProgressBar) findViewById(R.id.bar);
            imageView= (ImageView) findViewById(R.id.imageView);
            //创建对象
            task=new MyAsyncTask();
            //启动异步处理
            task.execute(url);
    
        }
        class MyAsyncTask extends AsyncTask<String,Integer,Bitmap>{
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                bar.setVisibility(View.VISIBLE);
            }
            @Override
            protected Bitmap doInBackground(String... strings) {
    
                for (int i=0;i<100;i++){
                    publishProgress(i);//传递进度值给onProgressUpdate方法
                    try {
                        Thread.sleep(300);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                String url=strings[0];
                URLConnection connection;
                Bitmap bitmap=null;
                InputStream is;
                try {
                    connection=new URL(url).openConnection();
                    is=connection.getInputStream();
                    BufferedInputStream bis=new BufferedInputStream(is);
                    Thread.sleep(3000);
                    bitmap= BitmapFactory.decodeStream(bis);
                    is.close();
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return bitmap;
            }
    
            /**
             * 这个方法是承接doInBackground()方法中的i的
             * 通过Integer方法所传递出来的i作用到了values数组上
             * */
            @Override  //获取进度更新值
            protected void onProgressUpdate(Integer... values) {
                super.onProgressUpdate(values);
                /**
                 * 从values数组中传递过来的i作为mProgressBar的进度值
                 * 由于这里只传递进来一个数,所以这里只需要获取0就OK了~
                 * */
                bar.setProgress(values[0]);
            }
    
            @Override
            protected void onPostExecute(Bitmap bitmap) {
                super.onPostExecute(bitmap);
                bar.setVisibility(View.GONE);
                imageView.setImageBitmap(bitmap);
            }
        }
    }
    

    最后运行下!看效果如何...

  • 相关阅读:
    Nginx访问日志、 Nginx日志切割、静态文件不记录日志和过期时间
    nginx的安装 、Nginx默认虚拟主机、nginx用户认证、nginx 域名重定向
    lnmp架构、mysql的安装、php的安装、nginx相关
    限定某个目录禁止解析php 、限制user_agent 、php的配制文件、PHP的动态扩展模块
    配置url防盗链、目录权限访问控制Directory、文件访问权限控制FilesMatch
    指令的概述
    点击事件交互示例
    日期过滤器示例
    in和not in注意事项
    mysql里的case用法详解
  • 原文地址:https://www.cnblogs.com/zyl222/p/7595424.html
Copyright © 2011-2022 走看看