安卓中实现异步任务(2)——使用AsyncTask实现
问题背景
上次的文章大致介绍了几种安卓汇总实现异步任务的方法,讲得比较简要,有朋友问到具体的实现方式,现在开始分列几篇文章详细介绍这几种异步的具体实现。这篇讲得是基于asyncTask实现,持续更新。
实现demo
(1)实现我们的AsyncTask子类
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class MyAsyncTask extends AsyncTask<Integer,Integer,Integer> {
private final String TAG = "AsyncTask";
private TextView textView;
private ProgressBar progressBar;
private Context context;
public MyAsyncTask(TextView textView, ProgressBar progressBar, Context context) {
this.textView = textView;
this.progressBar = progressBar;
this.context = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d(TAG,"onPreExecute(): " + Thread.currentThread().getName());
}
@Override
protected Integer doInBackground(Integer... ints) {
Integer count = ints[0];
while (count < 10 && !isCancelled()){
// isCancelled()表示判断当前任务是否被取消,防止在取消异步任务的时候循环不能及时停下
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
Log.d(TAG,"doInBackground(): "+ Thread.currentThread().getName() +" "+count);
publishProgress(count);
}
return count;
}
@Override
protected void onPostExecute(Integer i) {
Log.d(TAG,"onPostExecute(): "+ Thread.currentThread().getName());
textView.setText(i + "");
}
@Override
protected void onProgressUpdate(Integer... values) {
Log.d(TAG,"onProgressUpdate(): " + Thread.currentThread().getName());
textView.setText(values[0]+"");
progressBar.setProgress(values[0]);
}
@Override
protected void onCancelled() {
Log.d(TAG,"nCancelled(): "+Thread.currentThread().getName());
super.onCancelled();
Toast.makeText(context,"任务取消成功", Toast.LENGTH_LONG).show();
}
}
(2)新建我们的activity,对应layout布局如下:
<?xml version="1.0" encoding="utf-8"?>
<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=".thread.AsyncTaskActivity">
<TextView
android:id="@+id/textView"
android:hint="0"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:id="@+id/progressBar"
android:progress="0"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:text="启动任务"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:onClick="doTaskClick" />
<Button
android:text="取消任务"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:onClick="cancelTaskClick" />
</RelativeLayout>
</LinearLayout>
(3)对应我们activity的代码如下:
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
public class AsyncTaskActivity extends AppCompatActivity {
private TextView textView;
private ProgressBar progressBar;
private MyAsyncTask myAsyncTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_async_task);
textView= findViewById(R.id.textView);
progressBar= findViewById(R.id.progressBar);
}
public void doTaskClick(View view){
myAsyncTask = new MyAsyncTask(textView, progressBar,this);
// 执行异步任务,传入初始参数
myAsyncTask.execute(1);
}
public void cancelTaskClick(View view){
// 取消异步任务
myAsyncTask.cancel(true);
}
}
执行结果如下:
安卓中实现异步任务(2)——使用AsyncTask实现
问题背景
上篇文章大致介绍了几种安卓汇总实现异步任务的方法,讲得比较简要,有朋友问到具体的实现方式,现在开始分列几篇文章详细介绍这几种异步的具体实现。这篇讲得是基于asyncTask实现,持续更新。
实现demo
(1)实现我们的AsyncTask子类
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class MyAsyncTask extends AsyncTask<Integer,Integer,Integer> {
private final String TAG = "AsyncTask";
private TextView textView;
private ProgressBar progressBar;
private Context context;
public MyAsyncTask(TextView textView, ProgressBar progressBar, Context context) {
this.textView = textView;
this.progressBar = progressBar;
this.context = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d(TAG,"onPreExecute(): " + Thread.currentThread().getName());
}
@Override
protected Integer doInBackground(Integer... ints) {
Integer count = ints[0];
while (count < 10 && !isCancelled()){
// isCancelled()表示判断当前任务是否被取消,防止在取消异步任务的时候循环不能及时停下
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
Log.d(TAG,"doInBackground(): "+ Thread.currentThread().getName() +" "+count);
publishProgress(count);
}
return count;
}
@Override
protected void onPostExecute(Integer i) {
Log.d(TAG,"onPostExecute(): "+ Thread.currentThread().getName());
textView.setText(i + "");
}
@Override
protected void onProgressUpdate(Integer... values) {
Log.d(TAG,"onProgressUpdate(): " + Thread.currentThread().getName());
textView.setText(values[0]+"");
progressBar.setProgress(values[0]);
}
@Override
protected void onCancelled() {
Log.d(TAG,"nCancelled(): "+Thread.currentThread().getName());
super.onCancelled();
Toast.makeText(context,"任务取消成功", Toast.LENGTH_LONG).show();
}
}
(2)新建我们的activity,对应layout布局如下:
<?xml version="1.0" encoding="utf-8"?>
<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=".thread.AsyncTaskActivity">
<TextView
android:id="@+id/textView"
android:hint="0"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:id="@+id/progressBar"
android:progress="0"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:text="启动任务"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:onClick="doTaskClick" />
<Button
android:text="取消任务"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:onClick="cancelTaskClick" />
</RelativeLayout>
</LinearLayout>
(3)对应我们activity的代码如下:
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
public class AsyncTaskActivity extends AppCompatActivity {
private TextView textView;
private ProgressBar progressBar;
private MyAsyncTask myAsyncTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_async_task);
textView= findViewById(R.id.textView);
progressBar= findViewById(R.id.progressBar);
}
public void doTaskClick(View view){
myAsyncTask = new MyAsyncTask(textView, progressBar,this);
// 执行异步任务,传入初始参数
myAsyncTask.execute(1);
}
public void cancelTaskClick(View view){
// 取消异步任务
myAsyncTask.cancel(true);
}
}
执行结果如下:
根据log,我们可以很清楚的看到asyncTask对应各方法所在的线程以及执行时机;
关键代码分析
持续更新。。。
标签:异步,void,private,progressBar,AsyncTask,安卓中,import,android,textView From: https://blog.51cto.com/baorant24/5786130