AsyncTask(异步通信)

先new一个class继承AsyncTask类,AsyncTask要求提供三个泛型参数(Params 、Progress 、Result )其中,Params 为启动任务执行的输入参数,比如HTTP请求的URL;Progress 为后台任务执行的百分比;Result 后台执行任务最终返回的结果,比如String;然后AsyncTask的几个方法重写onPreExecute()、doInBackground()、onPostExecute()、onProgressUpdate(),其中doInBackground()为必须重写的;

例如:

class MyAsyncTask extends AsyncTask<Void, Void, Void>{

        //第一个调用的方法可以用来初始化一些数据
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.i("info", "onPreExecute");
        }
        //用于异步处理的方法,此方法不在主线程中运行
        @Override
        protected Void doInBackground(Void... params) {
            publishProgress();
            Log.i("info", "doInBackground");
            return null;
        }
        //doInBackground方法结束时调用
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            Log.i("info", "onPostExecute");
        }
        //只有doInBackground方法中调用了publishProgress()时才会执行
        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
            Log.i("info", "onProgressUpdate");
        }
    }

值得注意的是这四个方法中只有doInBackground()方法不在主线程中运行,所以所有耗时操作我们将在doInBackground() 方法中进行,其他的三个方法都可以改变UI

下面来一个加载网上图片的案例:

布局文件:

<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.example.asynctaskdemo.ImageTestActivity" >

    <ProgressBar
        android:id="@+id/pb_bar"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:visibility="gone" />

    <ImageView
        android:id="@+id/iv_img"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />

</RelativeLayout>

Java文件:

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;

public class ImageTestActivity extends ActionBarActivity {
    private static final String URL = "https://www.baidu.com/img/bdlogo.png";
    private ImageView iv_img;
    private ProgressBar pb_bar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_test);
        iv_img = (ImageView) findViewById(R.id.iv_img);
        pb_bar = (ProgressBar) findViewById(R.id.pb_bar);
        MyscyncTask mTask = new MyscyncTask();
        mTask.execute(URL);
    }

    class MyscyncTask extends AsyncTask<String, Void, Bitmap> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pb_bar.setVisibility(View.VISIBLE);
        }

        @Override
        protected Bitmap doInBackground(String... params) {
            String url = params[0];
            HttpURLConnection conn = null;
            Bitmap bitmap = null;
            try {
                //线程休眠1秒,方便看进度条
                Thread.sleep(1000);
                conn = (HttpURLConnection) new URL(url).openConnection();
                InputStream is = conn.getInputStream();
                BufferedInputStream bis = new BufferedInputStream(is);
                bitmap = BitmapFactory.decodeStream(bis);
                bis.close();
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap result) {
            super.onPostExecute(result);
            pb_bar.setVisibility(View.GONE);
            iv_img.setImageBitmap(result);
        }

    }
}

为了方便查看代码所以我将AsyncTask写成了内部类

由于图片资源较小,所以我用了一个线程休眠1秒,方便查看进度条

再来一个模拟进度条的案例

布局文件:

<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.example.asynctaskdemo.ProgressBarTestActivity" >

    <ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />

</RelativeLayout>

Java文件:

import android.os.AsyncTask;
import android.os.AsyncTask.Status;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.ProgressBar;

public class ProgressBarTestActivity extends ActionBarActivity {
    private ProgressBar progressBar1;
    private MyAsyncTask mTask;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_progress_bar_test);
        progressBar1 = (ProgressBar) findViewById(R.id.progressBar1);
        mTask = new MyAsyncTask();
        mTask.execute();
    }
    //将AsyncTask的生命周期与Activity进行绑定
    @Override
    protected void onPause() {
        super.onPause();
        if(mTask != null && mTask.getStatus() == Status.RUNNING){
            mTask.cancel(true);
        }
    }
    class MyAsyncTask extends AsyncTask<Void, Integer, Void>{

        @Override
        protected Void doInBackground(Void... params) {
            for (int i = 0; i < 100; i++) {
                if(isCancelled()){
                    break;
                }
                try {
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                publishProgress(i);
            }
            return null;
        }
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            if(isCancelled())
                return;
            progressBar1.setProgress(values[0]);
        }

    }

}

注意:由于AsyncTask底层是通过线程池进行作用的所以只有一个AsyncTask线程运行结束后另一个AsyncTask线程才可以运行,为了解决这一个为题,我们可以将AsyncTask的生命周期与Activity的生命周期进行绑定

时间: 2024-10-09 22:35:53

AsyncTask(异步通信)的相关文章

Android--智能机器人聊天

借助API,可快速实现在安卓手机上的与智能机器人聊天的功能.大体的步骤有:1.异步请求数据:2.解析json数据:3.封装数据:4.实现布局: 源代码下载地址:http://download.csdn.net/detail/leyezhiqiu/9471571 实现效果如下图: 下面一一介绍. 1.在浏览器上获取与机器人对话的数据. 1)打开图灵机器人官网,注册账号www.tuling123.com/openapi . 2)登录账号,记录下官方分配给账号的key. 3)在账号中查看获得数据的格式

异步获取网络图片Bitmap

从网路获取图片,使用AsyncTask异步通信. 异步代码如下: public void addTask(String url) { new AsyncTask<String, Void, Bitmap>() { @Override protected Bitmap doInBackground(String... params) { // 后台通信 return decodeBitmap(params[0]); // return byteBitmap(params[0]); } @Over

201709013工作日记--Android异步通信AsyncTask

参考相关博客:http://blog.csdn.net/liuhe688/article/details/6532519 在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制.关于Handler的相关知识,前面也有所介绍,不清楚的朋

异步通信----WebSocket

什么是WebSocket? WebSocket API是下一代客户端-服务器的异步通信方法.该通信取代了单个的TCP套接字,使用ws或wss协议,可用于任意的客户端和服务器程序.WebSocket目前由W3C进行标准化.WebSocket已经受到Firefox 4.Chrome 4.Opera 10.70以及Safari 5等浏览器的支持. WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息.WebSocket并不限于以Ajax(或XHR)方式通

Handler, AsyncTask用法简单示例

package com.jim.testapp; import android.app.Activity; import android.os.AsyncTask; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import androi

Android异步加载全解析之使用AsyncTask

Android异步加载全解析之使用AsyncTask 概述 既然前面提到了多线程,就不得不提到线程池,通过线程池,不仅可以对并发线程进行管理,更可以提高他们执行的效率,优化整个App.当然我们可以自己创建一个线程池,不过这样是很烦的,要创建一个高效的线程池还是挺费事的,不过,Android系统给我吗提供了AsyncTask这样一个类,来帮助我们快速实现多线程开发,它的底层实现,其实就是一个线程池. AsyncTask初探 AsyncTask,顾名思义就是用来做异步处理的.通过AsyncTask,

android Asynctask的优缺点?能否同时并发100+asynctask呢?

一  Asynctask的优缺点? AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 优点: 1.简单,快捷 2.过程可控 3.使用的缺点: 缺点: 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理. 首先明确Android之所以有Handle

JavaScript使用Ajax实现异步通信

一.浏览器与服务器的同步和异步通信 1.同步:是阻塞的,浏览器在向服务器发送请求之后一直等待服务器的响应,而没有做其他事情. 2.异步:非阻塞的,浏览器向服务器发送请求之后,继续执行其他代码,得到服务器响应后,浏览器中断当前的任务,处理服务器响应. 二.没有Ajax之前浏览器是通过iframe来实现异步刷新 1.iframe标签:iframe标签通过src连接到一个页面,其实就是将需要实现异步刷新的内容使用iframe标签包裹 A.对iframe实现整个页面刷新,其实是通过刷新一个页面的子页面来

AsyncTask实现网络图片的异步加载

想要实现网络中图片的加载,主线程是不行的,方法有两个,一个是使用线程Tread(),另一个就是使用AsyncTask,AsyncTask其实也是线程.我看过慕课网里边一个叫做<Android必学-异步加载>的视频,部分代码: 1 //-----------------------AsyncTask异步访问图片----------------------- 2 3 public void showImageByAsyncTask(ImageView imageView,String url){