Android里用AsyncTask后的接口回调

android studio 教程 | 2019-03-22 03:36

AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程。

AsyncTask在网络通讯中用到的特别多,一般我们都新建一个类专门处理这块的,但是在异步处理完后可能需要主线程中同步一些显示,所以就用到了回调函数,今天我们也主要讲的是回调函数。

视频效果

代码演示

我们用Android Studio新建一个AsyncCallBack的项目,我们建一个输入数字计算它的N次方得到的结果,在计算的过程中用AsyncTask进行处理,得到的结果通过回调函数在主界面Activity中显示。

布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns: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的接口,用于实现异步处理数据结果。里面只有一个方法就是输入一个字符串的参数。

package dem.vac.asynccallback;/** * 作者:Vaccae * 邮箱: * 创建时间:2019-03-18 10:46 * 功能模块说明: */public interface callback { void OnResult(String strings);}

然后再做AsyncTask的异步计算,这里面我们加了一个ProgressDialog,用于在计算过程中显示

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); }}

Vaccae的往期经典

数据库及其它