`
XiangdongLee
  • 浏览: 93189 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

【攻克Android(26)】Async Task 异步任务

阅读更多
本文围绕以下两个部分展开:

一、Async Task 异步任务
案例一:通过Async Task进行线程间通信(非 UI进程更新 UI、处理耗时任务)





一、Async Task 异步任务

        1. Async Task 异步任务

        AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类。AsyncTask的内部实现是一个线程池,每个后台任务会提交到线程池中的线程执行,然后使用Thread+Handler的方式调用回调函数。

        2. 使用方法

    /**
     * 自定义异步任务类 - 继承自 AsyncTask 类
     */

    /*
        三个模板参数:
        (传入参数类型, 进度类型, 返回值类型)
        Params:传递给后台任务的参数类型。
        Progress:后台计算执行过程中,进步单位(progress units)的类型。
                (就是后台程序已经执行了百分之几了。)
        Result:后台执行返回的结果的类型。

        AsyncTask并不总是需要使用上面的全部3种类型。
        标识不使用的类型,只需要使用Void类型即可。
     */
    private class XxxTask extends AsyncTask<Params, Progress, Result> {

        /**
         * 1. 准备运行(可选)
         * <p/>
         * 该回调函数在任务被执行之后立即由UI线程调用。
         *
         * 这个步骤通常用来建立任务,在用户接口(UI)上显示进度条。
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        /**
         * 2. 正在后台运行(必须重写)
         *
         * 该回调函数由后台线程在onPreExecute()方法执行结束后立即调用。
         * <p/>
         * 通常在这里执行耗时的后台计算。
         * 计算的结果必须由该函数返回,并被传递到 onPostExecute()中。
         * <p/>
         * 在该函数内也可以使用 publishProgress(Progress...)来发布一个或多个进度单位。
         * 这些值将会在 onProgressUpdate(Progress...)中被发布到 UI线程
         *
         * @param params
         * @return
         */
        @Override
        protected String doInBackground(String... params) {

            return params[0];
        }

        /**
         * 3. 完成后台任务(可选)
         *
         * 当后台计算结束后调用。
         *
         * 后台计算的结果会被作为参数传递给这一函数。
         *
         * @param s 后台计算的结果
         */
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
        }

        /**
         * 4. 进度更新 (可选)
         * <p/>
         * 该函数由 UI线程在 publishProgress(Progress...)方法调用完后被调用。
         *
         * 一般用于动态地显示一个进度条。
         *
         * @param values
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
        }

        /**
         * 5. 取消任务(可选)
         * <p/>
         * 在调用AsyncTask的cancel()方法时调用
         */
        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
    }



案例一:通过Async Task进行线程间通信(非 UI进程更新 UI、处理耗时任务)

        效果如下:

        进入主界面后,显示一个按钮:



        当点击该按钮的时候,跳到另一个界面:异步任务界面。



        要实现左上角“异步任务”左侧的回退按钮,只需要在功能清单文件中添加如下一句话:

android:parentActivityName=".MainActivity"


        添加到该Activity中:

<activity
            android:name=".AsyncTaskActivity"
            android:label="@string/title_activity_async_task"
            android:parentActivityName=".MainActivity" />


        当点击START按钮的时候,条形进度条和文本进度,都会以0.2秒增加1的速度增长,一直到100。





        当进度达到100的时候,会弹出Toast提示:“结果:Google”。




        (1)strings.xml

<resources>
    <string name="app_name">Async Task</string>

    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>

    <string name="btn_start">Start</string>
    <string name="btn_async_task">Async Task 异步任务</string>
    <string name="title_activity_async_task">异步任务</string>

</resources>


        (2)activity_main.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=".MainActivity">

    <Button
        android:id="@+id/btnAsyncTask"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="@string/btn_async_task" />

</RelativeLayout>


        (3)新建一个Activity: AsyncTaskActivity。并在功能清单中设置回退按钮。

        (4)MainActivity。主活动。按钮的点击事件。

public void onClick(View view) {
        startActivity(new Intent(this, AsyncTaskActivity.class));
    }


        (5)activity_async_task.xml。异步任务活动布局。包括一个START按钮,一个条形进度条和一个文本(文本进度)。

<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="com.android.handlerthread.AsyncTaskActivity">

    <Button
        android:id="@+id/btnStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="@string/btn_start" />

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/btnStart"
        android:visibility="gone" />

    <TextView
        android:id="@+id/tvScale"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/progressBar"
        android:visibility="gone" />

</RelativeLayout>

    <!-- 设置 ProgressBar 和 TextView 不可见,
 当点击 START 按钮的时候,才可见。-->


        (6)AsyncTaskActivity。通过Async Task进行线程间通信(非 UI进程更新 UI、处理耗时任务)

package com.android.handlerthread;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;


public class AsyncTaskActivity extends Activity {
    // 1.1 要用到主界面中的 ProgressBar 和 TextView,因此要先声明并初始化。
    // 声明两个控件(RatingBar 和 TextView)
    private ProgressBar progressBar;
    private TextView tvScale;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_async_task);

        // 1.2 初始化两个控件(ProgressBar 和 TextView)
        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        tvScale = (TextView) findViewById(R.id.tvScale);
    }

    public void onClick(View view) {
        // 2. 设置控件可见,并启动任务
        progressBar.setVisibility(View.VISIBLE);
        tvScale.setVisibility(View.VISIBLE);
        UpdateTask task = new UpdateTask();
        // 这里输入的参数会传输给 doInBackground()方法
        task.execute("Google");
    }

    /**
     * 3. 自定义异步任务类
     */
    private class UpdateTask extends AsyncTask<String, Integer, String> {

        /**
         * 3.1 准备运行(可选)
         */
        @Override
        protected void onPreExecute() {
            // 设置最大进度值:100
            progressBar.setMax(100);
        }

        /**
         * 3.2 正在后台运行(必须重写)
         *
         * @param params
         * @return
         */
        @Override
        protected String doInBackground(String... params) {
            for (int i = 0; i < 100; i++) {
                // 5.2.1 设置进度值
                // 发布一个或多个进度单位(units of progress)。
                // 这些值将会在 onProgressUpdate(Progress...)中被发布到 UI线程
                this.publishProgress(i + 1);
                try {
                    // 5.2.2 模拟具体完成的耗时任务 --- 比如:访问网络。
                    // 200毫秒,进度增 1
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (isCancelled()) {
                    return "Cancelled";
                }
            }
            return params[0];
        }

        /**
         * 3.4 完成后台任务(可选)
         *
         * @param result 后台计算的结果
         */
        @Override
        protected void onPostExecute(String result) {
            // 完成后台任务后,给一个 Toast 提示
            Toast.makeText(getApplicationContext(), "结果:" + result,
                    Toast.LENGTH_SHORT).show();
        }

        /**
         * 3.3 进度更新 (可选)
         *
         * @param values
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            // 因为只传入一个值:"Google",因此对应的进度更新的时候,也是 values[0]
            progressBar.setProgress(values[0]);
            tvScale.setText(String.format("%d / %d", values[0], 100));
        }

        /**
         * 取消任务(可选)
         */
        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
    }

    // -----------------------------------------------------------
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_async_task, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
  • 大小: 20.8 KB
  • 大小: 13.9 KB
  • 大小: 16.2 KB
  • 大小: 12.4 KB
  • 大小: 18.4 KB
分享到:
评论

相关推荐

    博客资源:RxJava封装异步任务RxAsyncTask

    **RxAsyncTask** 的出现就是为了解决这些问题,它利用RxJava的特性,将异步任务的执行和结果传递变得更加优雅和高效。 **RxJava的核心概念:** 1. **Observable(可观测者)** - 发布数据的源头,可以是任何产生...

    C#_5.0使用Task_Await_Async实现异步编程

    在C# 5.0及更高版本中,`Task`, `Await` 和 `Async` 关键字是异步编程的核心工具,它们极大地简化了多线程和非阻塞操作的处理,尤其对于UI应用程序如WinForm,能确保用户体验的流畅性。本示例通过一个简单的WinForm...

    android-async-http-1.4.9下载

    在Android应用开发中,网络通信是必不可少的一部分,而`android-async-http`库是一个非常流行的异步HTTP客户端库,特别适合处理与服务器的交互。这个库由Leonardo Uribe创建,它提供了简单易用的API,使开发者可以...

    android-async-http的jar包

    Android-Async-Http是一个流行的开源库,用于在Android应用程序中执行异步HTTP请求。这个库由Loopj开发,简化了网络交互的过程,使得开发者能够更高效地处理网络操作,而无需阻塞主线程,从而避免ANR(Application ...

    Task异步执行任务[C#源码]

    总之,`Task`异步执行任务是C#中进行高效率、低开销异步编程的关键工具,它简化了并发代码的编写,提高了程序的可读性和可维护性。通过深入理解并熟练运用`Task`,开发者能更好地应对现代计算环境中的性能挑战。

    android-async-http 源码

    https://oss.sonatype.org/content/repositories/snapshots/com/loopj/android/android-async-http/ Maven URL: https://oss.sonatype.org/content/repositories/snapshots/ GroupId: com.loopj.android ArtifactId...

    安卓网站交互JSONxmlWebserviceUPnP相关-android-async-http是Android上的一个异步基于回调的HTTP客户端开发包建立在Apache的HttpClient库上.zip

    android-async-http是Android上的一个异步、基于回调的HTTP客户端开发包,建立在Apache的HttpClient库上.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    android async异步上传图片

    首先,`android-network-request-async-httpclient`这个项目可能是一个示例或者库,它展示了如何利用Android的AsyncTask和Apache HttpClient来实现图片的异步上传。Apache HttpClient是一个功能强大的HTTP客户端库,...

    Android android-async-http-1.4.9

    `android-async-http-1.4.9` 是一个专为Android设计的异步HTTP库,它简化了网络请求的处理流程,使开发者能够更高效地进行网络通信。这个库由Leonard Brünings创建,并且在早期的Android开发中广泛使用。 ### 异步...

    Android AsyncTask用法和异步加载图片.rar

    总的来说,`AsyncTask`是Android中实现简单异步操作的有效工具,特别是对于轻量级的网络请求和计算任务。然而,对于更复杂的多线程需求,如大量的并发任务或复杂的任务协调,开发者可能需要考虑使用`IntentService`...

    Android Async-Http Demo

    在Android应用开发中,异步网络请求是必不可少的,它使得我们的应用能在后台加载数据,而不阻塞用户界面。"Android Async-Http Demo"是一个基于Android平台的示例项目,展示了如何使用Async-Http库来实现高效、非...

    Android-async-http-1.4.9.jar

    android-async-http-1.4.9.jar是一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用android-async-http这个库可以大大的简化操作,它是...

    android-async-http 安卓异步http框架

    为了提升用户体验,异步处理网络请求变得至关重要,而`Android-Async-Http`框架正是为此目的设计的一个强大工具。它由Leonardo Uribe创建,并在GitHub上开源,为开发者提供了简洁、高效的异步HTTP请求解决方案。 ##...

    android-async-http-master

    1. **异步操作**:Android-Async-Http通过在后台线程执行网络任务,避免了主线程的阻塞,确保UI的流畅性。它会自动处理线程切换,将网络响应结果回调到主线程,以便安全地更新UI。 2. **易于使用**:这个库提供了...

    android-async-http-master.zip

    《Android异步HTTP框架——深入理解android-async-http-master》 在移动开发领域,尤其是在Android平台上,网络请求是不可或缺的一部分。高效、稳定的网络通信库能够极大地提升应用的用户体验。"android-async-...

    android-async-http-1.4.3最新jar包

    android的异步网络加载,方便使用,免去多余的代码

    android-async-http-1.4.3-master.zip

    《Android异步HTTP框架——android-async-http-1.4.3详解》 在移动开发领域,Android应用程序经常需要与服务器进行数据交互,这通常涉及到网络请求。由于Android系统的设计特性,直接在主线程中执行网络操作会导致...

    Asynctask异步加载的使用

    "Asynctask异步加载的使用"这一主题涵盖了如何利用Android SDK中的AsyncTask类来实现后台任务的执行,并在UI线程更新结果。以下是对这个知识点的详细讲解: AsyncTask是Android提供的一种轻量级的异步处理机制,...

    Android Async异步通信框架

    Android Async通信框架就是为了解决这个问题而设计的,它使得开发者能够轻松地处理后台任务并更新UI。本框架主要关注于简化网络请求的实现,并提供了一个高效的异步处理机制。 Android AsyncHttpClient是这个框架的...

    android-async-http官方项目

    android-async-http官方项目:来自Github; 该项目中包含了多个版本的android-async-http.jar包,目前最新版本是:android-async-http-1.4.5.jar; 地址:原项目地址:https://github.com/loopj/android-async-http

Global site tag (gtag.js) - Google Analytics