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

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

posted @ 2017-09-26 10:30  陌上花开222  阅读(381)  评论(0编辑  收藏  举报