You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 10:00:00