zoukankan      html  css  js  c++  java
  • Android笔记(三十五) Android中AsyncTask

           AsyncTask<Params,Progress,Result> 是一个抽象类,通常继承这个抽象类需要指定如下几个泛型参数:

          1.  Params :启动任务时出入参数的类型

          2.  Progress :后台任务执行中返回进度值的类型

          3.  Result :后台执行任务完成后返回结果的类型

          构建AsyncTask子类必须重现的方法:

          1.  doInBackGround() :必须重写,这个方法用来写异步执行后台线程将要完成的任务。

          2.  onPreExcute() :该方法在后台耗时操作前被调用,通常用户完成一些初始化操作。

          3.  onPostExcute() :当doInBackGround()完成之后,系统会自动调用该方法,并将doInBackGround ()方法返回的值传给该方法。

          4.  onProgressUpdate() :在doInBackGround()方法中调用 publishProgress() 方法,会触发该方法,可以更新任务的执行进度。

          先看一下这个AsyncTask的执行顺序。

          MyAsyncTask.java

    package cn.lixyz.asynctest;
    
    import android.os.AsyncTask;
    import android.util.Log;
    
    /**
     * Created by LGB on 2015/10/10.
     */
    public class MyAsyncTask extends AsyncTask {
        @Override
        protected Object doInBackground(Object[] params) {
            Log.d("XXXXX", "doInBackground...");
            publishProgress();
            return null;
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.d("XXXXX", "onPreExecute...");
        }
    
        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);
            Log.d("XXXXX", "onPostExecute...");
        }
    
        @Override
        protected void onProgressUpdate(Object[] values) {
            super.onProgressUpdate(values);
            Log.d("XXXXX", "onProgressUpdate...");
        }
    }

          MainActivity.java

    package cn.lixyz.asynctest;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
            
            MyAsyncTask task = new MyAsyncTask();
            task.execute();
        }
    }

          执行结果:

          那么运用到实际中会是什么样子的呢?看一个例子

          MainActivity.java

    package cn.lixyz.asynctest;
    
    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.widget.Button;
    import android.widget.ImageView;
    import android.widget.ProgressBar;
    
    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;
    import java.net.URLConnection;
    
    public class MainActivity extends Activity{
    
        private Button button;
        private ImageView imageView;
        private ProgressBar progressBar;
        private String URL="http://ww3.sinaimg.cn/bmiddle/612c96afjw1ewwftl3uqkj20u00koq48.jpg";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
    
            //获取组件
            button = (Button) findViewById(R.id.button);
            imageView = (ImageView) findViewById(R.id.imageView);
            progressBar = (ProgressBar) findViewById(R.id.progressBar);
    
            //给button设置点击事件,点击按钮,启动异步任务
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    new LoadImage().execute(URL);
                }
            });
    
    
        }
    
        class LoadImage extends AsyncTask<String,Void,Bitmap>{
    
    
            //开始执行耗时操作,连接网络获取图片,并且将Bitmap返回
            @Override
            protected Bitmap doInBackground(String... params) {
                String url = params[0];
                Bitmap bitmap = null;
                URLConnection connection;
                InputStream is;
                try {
                    connection = new URL(url).openConnection();
                    Thread.sleep(5000);
                    is = connection.getInputStream();
                    BufferedInputStream bis = new BufferedInputStream(is);
                    bitmap  = BitmapFactory.decodeStream(bis);
                    is.close();
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return bitmap;
            }
    
            //onPreExcute方法是在doInBackGround方法前执行,用于做一些初始化操作,这里将progressBar显示出来
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                progressBar.setVisibility(View.VISIBLE);
            }
    
    
            //doInBackGround方法执行后,会自动执行该方法,获取到doInBackGround返回的对象,然后更改UI
            @Override
            protected void onPostExecute(Bitmap bitmap) {
                super.onPostExecute(bitmap);
                progressBar.setVisibility(View.GONE);
                imageView.setImageBitmap(bitmap);
            }
        }
    }

          activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="4">
            <ImageView
                android:id="@+id/imageView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"/>
            <ProgressBar
                android:id="@+id/progressBar"
                android:visibility="gone"
                android:layout_centerInParent="true"
                style="@style/Widget.AppCompat.ProgressBar"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </RelativeLayout>
    
    
        <Button
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="点击载入" />
    </LinearLayout>

          执行结果:

          android从4.0之后就不允许在主线程中进行网络访问了,并且耗时操作如果超过5秒就会引起ANR,所以我们通常将一些耗时操作(网络连接、下载)放到异步任务中进行。

     

  • 相关阅读:
    检查 Linux 服务器性能
    openssl、x509、crt、cer、key、csr、ssl、tls 这些都是什么鬼?
    Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发
    如何在 Linux 上录制你的终端操作
    Swift 开源 Linux Ubuntu Install
    SCP 命令
    ubuntu openfire Server install
    git 和 svn 的比较
    implicitly declaring function 'malloc' with type void *(unsigned long ) 错误 解决
    python 使用缓存加快运算
  • 原文地址:https://www.cnblogs.com/xs104/p/4867401.html
Copyright © 2011-2022 走看看