Android AsyncTask详解
Posted shineyoung
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android AsyncTask详解相关的知识,希望对你有一定的参考价值。
android AsyncTask是一个轻量级的异步任务处理类
常见的使用步骤->创建一个继承自AsyncTask类的异步任务处理类
(AsyncTask<Params,Progress,Result>
Params启动任务执行的输入参数,比如一组URL
Progress后台任务执行的百分比
Result执行完任务后的返回结果)
class MyAsyncTask extends AsyncTask<Integer, Integer, String> @Override protected String doInBackground(Integer... params) //运行在工作线程 //在onPreExecute方法执行完成后马上执行,负责执行 //耗时的后台处理任务,可调用publishProgress方法实 //时更新任务进度 @Override protected void onPreExecute() //运行在UI线程 //在执行后台耗时操作之前,通常用于一些初始化操作,比如进度条显示 @Override protected void onProgressUpdate(Integer... values) //运行在UI线程 //在doBackground方法中,每次调用publishProgress方法都会触发该方法
->在UI线程创建MyAsyncTask实例
->在UI线程中调用mAsyncTask.execute()
一个完整的例子
MainActivity
package com.example.myfirstapp; import androidx.appcompat.app.AppCompatActivity; 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 AppCompatActivity private TextView txttitle; private ProgressBar pgbar; private Button btnupdate; @Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txttitle = (TextView)findViewById(R.id.txttitle); pgbar = (ProgressBar)findViewById(R.id.pgbar); btnupdate = (Button)findViewById(R.id.btnupdate); btnupdate.setOnClickListener(new View.OnClickListener() @Override public void onClick(View v) MyAsyncTask myTask = new MyAsyncTask(txttitle,pgbar); myTask.execute(1000); ); class DelayOperator //延时操作,用来模拟下载 public void delay() try Thread.sleep(1000); catch (InterruptedException e) e.printStackTrace();; class MyAsyncTask extends AsyncTask<Integer,Integer,String> private TextView txt; private ProgressBar pgbar; public MyAsyncTask(TextView txt,ProgressBar pgbar) super(); this.txt = txt; this.pgbar = pgbar; //该方法不运行在UI线程中,主要用于异步操作,通过调用publishProgress()方法 //触发onProgressUpdate对UI进行操作 @Override protected String doInBackground(Integer... params) DelayOperator dop = new DelayOperator(); int i = 0; for (i = 10;i <= 100;i+=10) dop.delay(); publishProgress(i); //i + params[0].intValue() return ""; //该方法运行在UI线程中,可对UI控件进行设置 @Override protected void onPreExecute() txt.setText("开始执行异步线程~"); //在doBackground方法中,每次调用publishProgress方法都会触发该方法 //运行在UI线程中,可对UI控件进行操作 @Override protected void onProgressUpdate(Integer... values) pgbar.setProgress(values[0].intValue());
布局代码
activity_main
<LinearLayout 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:orientation="vertical" tools:context=".MyActivity"> <TextView android:id="@+id/txttitle" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <!--设置一个进度条,并且设置为水平方向--> <ProgressBar android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/pgbar" style="?android:attr/progressBarStyleHorizontal"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnupdate" android:text="更新progressBar"/> </LinearLayout>
以上是关于Android AsyncTask详解的主要内容,如果未能解决你的问题,请参考以下文章
从片段调用 Android AsyncTask 没有调用其成员 - doInbackground、onpreexecute、onpostexecute