• Android—初识AsyncTask


          AsyncTask是用来处理一些后台的比较耗时的任务,给用户带来良好的体验。AsyncTask扩展Thread,增强了与主线程的交互能力。

          首先介绍AsyncTask中定义的以下几个方法:

          onPreExecute():该方法在执行后台操作前被UI线程调用,可以做一些准备工作,如图片加载之前先显示进度条等

          doInBackground(Params...):该方法运行在后台线程中,比较耗时的操作可以写在此方法中

          onProgressUpdate(Progress...):该方法只有在doInBackground(Params...)方法中调用了publishProgress()方法时候才会执行,用来显示后台任务的进展情况

          onPostExecute(Result): doInBackground(Params...)方法执行完毕以后,此方法会被UI线程调用,可以在此方法中对UI进行操作,比如显示图片内容等

          其次是AsyncTask中的三个参数

           Params 启动任务执行的输入参数,比如HTTP请求的URL。       

           Progress 后台任务执行的进度值。        

           Result 后台执行任务最终返回的结果。

           最后用一个异步加载网络图片的实例更好的体现AsyncTask的作用:

           首先访问网络记得加入网络访问的权限

           1.Android项目的MainActivity的xml文件中放置button按钮如图:

          

        

           2.新建一个Activity用来显示网络加载的图片,在此Activity中新建一个内部类继承AsyncTask详情请参考代码以及注释:

           xml文件中:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".ImageActivity" >
    
        <ImageView 
            android:id="@+id/imageView"
           
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
        <ProgressBar
            android:id="@+id/progressBar1"
            android:visibility="gone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true" />
       
    </RelativeLayout>

          Activity中:

    package com.example.netdemo;
    
    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    
    
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.view.View;
    import android.view.Window;
    import android.widget.ImageView;
    import android.widget.ProgressBar;
    
    public class ImageActivity extends Activity {
        private ProgressBar progressBar;
        private ImageView imageView;
        //图片的地址
        private static final String URL="http://img3.3lian.com/2013/s1/20/d/57.jpg";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_image);
            findViewById();
            //启动
            new MyAsyncTask().execute(URL);
        }
    
        private void findViewById() {
            // TODO Auto-generated method stub
            progressBar = (ProgressBar) findViewById(R.id.progressBar1);
            imageView = (ImageView) findViewById(R.id.imageView);
        }
        /**
         * @String 传入的参数为图片的URL地址,String类型,
         * @Void 进度值先不考虑所以返回为空,
         * @Bitmap 后台执行任务最终返回的结果为一张图片Bitmap类型
         * @author cyf
         *
         */
        class MyAsyncTask extends AsyncTask<String, Void, Bitmap>{
            //后台没有运行完毕之前做的准备工作,在这我们让原本隐藏的progressBar显示
            @Override
            protected void onPreExecute() {
                // TODO Auto-generated method stub
                super.onPreExecute();
                //后台运行的时候进度条显示
                progressBar.setVisibility(View.VISIBLE);
            }
            //在后台进行网络访问,得到图片并返回
            @Override
            protected Bitmap doInBackground(String... arg0) {
                // TODO Auto-generated method stub
                String url=arg0[0];
                Bitmap bitmap=null;
                //定义网络连接对象
                URLConnection connection;
                InputStream is;
                try {
                    connection= new URL(url).openConnection();
                    is=connection.getInputStream();
                    BufferedInputStream bis=new BufferedInputStream(is);
                    //将输入流解析成Bipmap
                    bitmap=BitmapFactory.decodeStream(bis);
                    is.close();
                    bis.close();
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return bitmap;
            }
            //在次方法中接收后台返回的Bitmap值并且设置到UI
            @Override
            protected void onPostExecute(Bitmap result) {
                // TODO Auto-generated method stub
                super.onPostExecute(result);
                //显示的progressBar再设置为隐藏
                progressBar.setVisibility(View.GONE);
                //在此方法中设置UI线程显示图片
                imageView.setImageBitmap(result);
                
            }
        }
    }

    上结果图:

    点击button之后的准备界面(progressBar显示表示正在加载):

    加载完成之后:

    欢迎大家提供意见,希望能给大家带来帮助,谢谢。

  • 相关阅读:
    【ecshop】 完全清除版权信息
    【ecshop】使用sql 清除测试数据
    Java异常处理:给程序罩一层保险
    想清楚你究竟想成为什么样的人了吗?
    Java集合类的那点通俗的认知
    2019年的第一天,我给自己定了一份读书计划
    Java的内部类真的那么难以理解?
    29岁了还一事无成是人生的常态?
    Java接口的实例应用:致敬我的偶像——何塞·穆里尼奥
    程序员年底众生相
  • 原文地址:https://www.cnblogs.com/yunfang/p/4942313.html
Copyright © 2020-2023  润新知