您的位置 首页 传感器

Android中AsyncTask的处理后台耗时操作

在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好的用

在开发Android移动客户端的时分往往要运用多线程来进行操作,咱们一般会将耗时的操作放在独自的线程履行,防止其占用主线程而给用户带来欠好的用户体会。可是在子线程中无法去操作主线程(UI 线程),在子线程中操作UI线程会出现过错。因而android供给了一个类Handler来在子线程中来更新UI线程,用发消息的机制更新UI界面,出现给用户。这样就处理了子线程更新UI的问题。可是费时的使命操作总会发动一些匿名的子线程,太多的子线程给体系带来巨大的担负,随之带来一些功能问题。因而android供给了一个东西类AsyncTask,望文生义异步履行使命。这个AsyncTask生来便是处理一些后台的比较耗时的使命,给用户带来杰出用户体会的,从编程的语法上显得高雅了许多,不再需求子线程和Handler就能够完结异步操作而且改写用户界面。

先大约知道下Android.os.AsyncTask类:

* android的类AsyncTask对线程间通讯进行了包装,供给了简易的编程办法来使后台线程和UI线程进行通讯:后台线程履行异步使命,并把操作成果告诉UI线程。

* AsyncTask是笼统类.AsyncTask界说了三种泛型类型 Params,Progress和Result。

* Params 发动使命履行的输入参数,比方HTTP恳求的URL。

* Progress 后台使命履行的百分比。

* Result 后台履行使命终究回来的成果,比方String,Integer等。

* AsyncTask的履行分为四个过程,每一步都对应一个回调办法,开发者需求完成这些办法。

* 1) 承继AsyncTask

* 2) 完成AsyncTask中界说的下面一个或几个办法

* onPreExecute(), 该办法将在履行实践的后台操作前被UI 线程调用。能够在该办法中做一些准备工作,如在界面上显现一个发展条,或许一些控件的实例化,这个办法能够不必完成。

* doInBackground(Params…), 将在onPreExecute 办法履行后立刻履行,该办法运转在后台线程中。这儿将首要担任履行那些很耗时的后台处理工作。能够调用 publishProgress办法来更新实时的使命发展。该办法是笼统办法,子类有必要完成。

* onProgressUpdate(Progress…),在publishProgress办法被调用后,UI 线程将调用这个办法从而在界面上展现使命的发展状况,例如经过一个发展条进行展现。

* onPostExecute(Result), 在doInBackground 履行完结后,onPostExecute 办法将被UI 线程调用,后台的计算成果将经过该办法传递到UI 线程,而且在界面上展现给用户.

* onCancelled(),在用户撤销线程操作的时分调用。在主线程中调用onCancelled()的时分调用。

为了正确的运用AsyncTask类,以下是几条有必要恪守的原则:

1) Task的实例有必要在UI 线程中创立

2) execute办法有必要在UI 线程中调用

3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params…), onProgressUpdate(Progress…)这几个办法,需求在UI线程中实例化这个task来调用。

4) 该task只能被履行一次,不然屡次调用时将会出现异常

doInBackground办法和onPostExecute的参数有必要对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground承受的参数,第二个为显现发展的参数,第第三个为doInBackground回来和onPostExecute传入的参数。

下面经过一个Demo来阐明怎么运用Android.os.AsyncTask类,经过发展条来显现进行的发展,然后用TextView来显现发展值。程序结构图如下:

[1] \layout\main.xml 布局文件源码如下:

[html] view plain copy

android:orientation=vertical

android:layout_width=fill_parent

android:layout_height=fill_parent

>

android:layout_width=fill_parent

android:layout_height=wrap_content

android:text=Hello , Welcome to Andy’s Blog!/>

android:id=@+id/download

android:layout_width=fill_parent

android:layout_height=wrap_content

android:text=Download/>

android:id=@+id/tv

android:layout_width=fill_parent

android:layout_height=wrap_content

android:text=当时发展显现/>

android:id=@+id/pb

android:layout_width=fill_parent

android:layout_height=wrap_content

style=?android:attr/progressBarStyleHorizontal/>

[2] /src中的MainActivity.java源码如下:

[html] view plain copy

package com.andyidea.demo;

import android.app.Activity;

import android.os.AsyncTask;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.ProgressBar;

import android.widget.TextView;

public class MainActivity extends Activity {

Button download;

ProgressBar pb;

TextView tv;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

pb=(ProgressBar)findViewById(R.id.pb);

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/298065.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部