android基础笔记——AsyncTask

原创 2015年01月26日 21:53:50

AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程。

这个类不需要操作线程(Thread)就可以完成后台操作将结果返回UI。


AsyncTask定义了三种泛型类型 Params,Progress和Result。

Params:启动任务执行的输入参数,比如HTTP请求的URL。
Progress:后台任务执行的百分比。
Result:后台执行任务最终返回的结果,比如String。


AsyncTask的执行步骤大致分为:

1.onPreExecute():在UI线程上调用任务后立即执行。这步通常被用于设置任务,例如在用户界面显示一个进度条。

2.doInBackground(Params...):后台线程执行onPreExecute()完后立即调用,这步被用于执行较长时间的后台计算。异步任务的参数也被传到这步。计算的结果必须在这步返回,将传回到上一步。在执行过程中可以调用publishProgress(Progress...)来更新任务的进度。

3.onProgressUpdate(Progress...):调用 publishProgress(Progress...)后,在UI线程中执行。执行时间是不确定的。这个方法用于当后台计算还在进行时在用户界面显示进度。例如:这个方法可以被用于一个进度条动画或在文本域显示记录。

4.onPostExecute(Result):当后台计算结束时,在 UI线程中执行。后台计算结果作为一个参数传递到这步。


使用AsyncTask类,以下是几条必须遵守的准则:

1、Task的实例必须在UI thread中创建;

2、execute方法必须在UI thread中调用;

3、不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;

4、该task只能被执行一次,否则多次调用时将会出现异常;


举例:

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="无内容" />

    <ProgressBar
        android:id="@+id/progressbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="更新" />

</LinearLayout>

MainActivity

package com.example.asynctask;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.os.Build;

public class MainActivity extends ActionBarActivity {

	private Button button;
	private ProgressBar progressBar;
	private TextView textView;

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

		textView = (TextView) findViewById(R.id.textview);
		progressBar = (ProgressBar) findViewById(R.id.progressbar);
		button = (Button) findViewById(R.id.button);

		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				myAsyncTask asyncTask = new myAsyncTask(textView, progressBar);
				// 在UI线程中执行asyncTask
				asyncTask.execute(1000);
			}
		});

	}

}

myAsyncTask

package com.example.asynctask;

import android.R.integer;
import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 * 生成该类的对象,并调用execute方法之后 
 * 首先执行的是onProExecute方法 
 * 其次执行doInBackgroup方法
 * 期间为了更新progressBar,调用onProgressUpdate 
 * 执行完成之后调用onPostExecute
 * 
 */
public class myAsyncTask extends AsyncTask<Integer, Integer, String> {
	private TextView textView;
	private ProgressBar progressBar;

	public myAsyncTask(TextView textView, ProgressBar progressBar) {
		this.textView = textView;
		this.progressBar = progressBar;
	}


    /**  
     * 这里的Integer参数对应AsyncTask中的第一个参数   
     * 这里的String返回值对应AsyncTask的第三个参数  
     * 该方法并不运行在UI线程当中,主要用于异步操作,所以在该方法中不能对UI当中的控件进行设置和修改  
     * 但是可以调用publishProgress方法触发onProgressUpdate对UI进行操作  
     */  
	@Override
	protected String doInBackground(Integer... params) {
		// TODO Auto-generated method stub
		netOperator operator = new netOperator();
		int i = 0;
		for (i = 10; i <= 100; i += 10) {
			operator.operator();
			publishProgress(i);
		}
		return i + params[0].intValue() + "";

	}

    /**  
     * 这里的Intege参数对应AsyncTask中的第二个参数  
     * 在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行  
     * onProgressUpdate是在UI线程中执行,所有可以对UI控件进行操作  
     */  
	@Override
	protected void onProgressUpdate(Integer... values) {
		// TODO Auto-generated method stub
		int value = values[0];
		progressBar.setProgress(value);
		// super.onProgressUpdate(values);
	}

	// 该方法在asyncTask执行前调用,运行在UI线程当中,可以对UI控件进行设置
	@Override
	protected void onPreExecute() {
		// TODO Auto-generated method stub
		textView.setText("开始执行异步线程");
	}


    /**  
     * 这里的String参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值)  
     * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI控件进行设置  
     */  
	@Override
	protected void onPostExecute(String result) {
		// TODO Auto-generated method stub
		textView.setText("异步线程执行完毕");
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android基础——AsyncTask

AsyncTask使在UI线程中使用变得容易。这个类允许执行后台操作并在UI线程返回一个结果,不用操作线程或handlers。 带着问题去学习: Asynctask具体用法? Asynctas...
  • wy819
  • wy819
  • 2016-05-16 20:14
  • 593

【Android基础】AsyncTask示例——加载网络图片

网络操作是一个严重的耗时操作,所以从Android 4.0版本开始,网络操作就被严禁放在主线程中,所以网络操作只能放在异步任务中。下面是一个从网络上下载图片的示例,示例分为两个部分: - 异步处理下...

<Android学习笔记一>——AsyncTask实现

AsyncTask异步任务类

Android学习笔记:Android异步任务之AsyncTask基础

AsyncTask是Android为了简化异步操作而封装的异步任务操作抽象类。当我们需要在程序中执行耗时的异步操作时,我们可以考虑使用AsyncTask来实现。 那么Android中为什么需要异步任...

android基础--AsyncTask

AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,需要多个异步操作是handler比较适合。AsyncTask适用一些简单的异步处理。 一个理解 AsyncT...

Android AsyncTask基础

  • 2016-03-05 01:29
  • 8.00MB
  • 下载

android基础学习之AsyncTask

AsyncTask是Android用来实现异步操作的一个类,因为被Android创造时加入了android的平台特性,因此,AsyncTask的异步操作相对于Thread来说,更安全、方便和实用。但其...

Android基础之进程和线程 AsyncTask , Handler

进程Process 默认情况下,一个应用程序的所有组件都在一个进程之中. 但也可以通过Manifest.xml文件中的android:process来指定某个控件属于哪个进程,也可以为指定进程 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)