前言
AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程。
AsyncTask在网络通讯中用到的特别多,一般我们都新建一个类专门处理这块的,但是在异步处理完后可能需要主线程中同步一些显示,所以就用到了回调函数,今天我们也主要讲的是回调函数。
视频效果
代码演示
我们用Android Studio新建一个AsyncCallBack的项目,我们建一个输入数字计算它的N次方得到的结果,在计算的过程中用AsyncTask进行处理,得到的结果通过回调函数在主界面Activity中显示。
布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"
android:padding="20dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="计算" />
<EditText
android:layout_width="50dp"
android:layout_height="wrap_content"
android:id="@+id/edtnum"
android:text="10"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="的"/>
<EditText
android:layout_width="50dp"
android:layout_height="wrap_content"
android:id="@+id/edtnum2"
android:text="3"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="次方数为:"/>
</LinearLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="计算"
android:gravity="center_horizontal"
android:id="@+id/btncalc"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tvResult"
android:gravity="center_horizontal"
android:text="计算结果"
android:textSize="15pt"/>
</LinearLayout>
MainActivity就很简单,我们直接加载了一下控件
显示的结果
创建回调函数接口
我们新建一个名称为callback的Interface的接口,用于实现异步处理数据结果。里面只有一个方法就是输入一个字符串的参数。
callback
package dem.vac.asynccallback;
/**
* 作者:Vaccae
* 邮箱:3657447@qq.com
* 创建时间:2019-03-18 10:46
* 功能模块说明:
*/
public interface callback {
void OnResult(String strings);
}
AsyncTask
然后再做AsyncTask的异步计算,这里面我们加了一个ProgressDialog,用于在计算过程中显示
CalcNum类
package dem.vac.asynccallback;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
/**
* 作者:Vaccae
* 创建时间:2019-03-18 10:28
* 功能模块说明:
*/
public class CalcNum extends AsyncTask<Integer,String,Integer> {
private ProgressDialog dialog;
private Context mContext;
private callback cb;
//输入数字
private int num;
//平方数
private int square;
public void SetData(Context context) {
mContext=context;
}
public void SetCallBack(callback c) {
this.cb=c;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog=new ProgressDialog(mContext);
dialog.setTitle("计算平方数");
// 设置显示文字
dialog.setMessage("开始计算");
// 设置进度条样式
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
// 设置采用进度条模糊模式
dialog.setIndeterminate(false);
// 这里必须先设置好的直接显示,能显示出来的更改才有效
dialog.show();
}
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
dialog.setMessage(values[0]);
}
@Override
protected Integer doInBackground(Integer... integers) {
num=integers[0];
square=integers[1];
publishProgress("开始计算次方数");
int tmpnum=num;
for (int i=2; i <= square; i++) {
tmpnum=tmpnum * num;
publishProgress( i + "次方结果为" + tmpnum);
try {
Thread.sleep(600);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return tmpnum;
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
dialog.dismiss();
cb.OnResult("计算的的结果为:" + integer);
}
}
MainActivity里实现回调后的显示
首先需要implements我们的callback
然后在btn的按钮事件中调用我们的AsyncTask的方法
最后要现callback的实现方法
完整代码
package dem.vac.asynccallback;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements callback {
//输入的数字
private EditText edtnum;
//输入的次方数
private EditText edtsquare;
//计算按钮
private Button btn;
//显示结果
private TextView tvResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//加载布局控件
edtnum=findViewById(R.id.edtnum);
edtsquare=findViewById(R.id.edtnum2);
btn=findViewById(R.id.btncalc);
tvResult=findViewById(R.id.tvResult);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//得到输入的数值
int num=Integer.parseInt(edtnum.getText().toString());
int square=Integer.parseInt(edtsquare.getText().toString());
CalcNum calcNum=new CalcNum();
calcNum.SetData(MainActivity.this);
calcNum.SetCallBack(MainActivity.this);
calcNum.execute(num,square);
}
});
}
@Override
public void OnResult(String strings) {
tvResult.setText(strings);
}
}
-END-