Android通用AsyncTask如何设置doInBackground完成后触发的回调函数
实现方案
核心是通过接口回调实现任务完成后的方法绑定,你只需要给可复用的GetData类增加回调接口即可,具体修改如下:
1 修正Main.java中的GetData类
你原代码存在类型不匹配问题:AsyncTask泛型指定返回值为Boolean,但doInBackground方法声明的返回类型为String,需要先修正这个问题,再新增回调逻辑:
package com.example.NAME; import android.os.AsyncTask; import java.net.HttpURLConnection; import java.net.URL; public class Main { // 定义回调接口 public interface GetRequestCallback { void onRequestComplete(Boolean result); } public static class GetData extends AsyncTask<String, Void, Boolean> { // 保存传入的回调实例 private GetRequestCallback callback; // 构造方法传入回调 public GetData(GetRequestCallback callback) { this.callback = callback; } protected void onPreExecute() { super.onPreExecute(); } // 修正返回类型为Boolean @Override protected Boolean doInBackground(String... params) { Boolean _return = false; try { String data = params[0]; // 此处执行你的HTTP GET请求逻辑,赋值_return // 示例参考逻辑: URL url = new URL(data); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); _return = conn.getResponseCode() == 200; conn.disconnect(); } catch (Exception e) { e.printStackTrace(); } return _return; } @Override protected void onPostExecute(Boolean _return) { super.onPostExecute(_return); // 任务完成后调用回调方法,传入结果 if (callback != null) { callback.onRequestComplete(_return); } } } }
2 修改Activity中的调用逻辑
在Activity中实例化GetData时,直接传入回调实现绑定你的after_GET_Request方法即可:
package com.example.NAME; import android.app.Activity; import android.os.Bundle; import android.view.View; public class Activity1 extends Activity { // Main类仅用来容纳静态类,不需要实例化,此行可删除 // private final Main main = new Main(); @Override protected synchronized void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.activity1); } public synchronized void GET_Request(View v) { // 实例化时传入回调,绑定你的处理方法 Main.GetData t = new Main.GetData(this::after_GET_Request); t.execute("你的GET请求URL字符串"); } public synchronized void after_GET_Request(Boolean b) { // 此处直接使用返回的Boolean结果即可 } }
补充说明
- 如果你的项目使用Java 8以下版本,不支持方法引用
this::after_GET_Request,可以用匿名内部类实现回调:Main.GetData t = new Main.GetData(new Main.GetRequestCallback() { @Override public void onRequestComplete(Boolean result) { after_GET_Request(result); } }); - AsyncTask在Android API 30中已被正式废弃,若你的项目targetSdk >= 30,建议后续替换为协程、WorkManager或OkHttp的异步请求方案。
内容的提问来源于stack exchange,提问作者aman
相关产品推荐
相关产品推荐

