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

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

  • 相关阅读:
    LeetCode——Generate Parentheses
    LeetCode——Best Time to Buy and Sell Stock IV
    LeetCode——Best Time to Buy and Sell Stock III
    LeetCode——Best Time to Buy and Sell Stock
    LeetCode——Find Minimum in Rotated Sorted Array
    Mahout实现基于用户的协同过滤算法
    使用Java对文件进行解压缩
    LeetCode——Convert Sorted Array to Binary Search Tree
    LeetCode——Missing Number
    LeetCode——Integer to Roman
  • 原文地址:https://www.cnblogs.com/zyl222/p/7595424.html
Copyright © 2011-2022 走看看