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

Android AsyncTask在onPostExecute启动Activity失败,求解决方法

问题解决方法

错误原因分析

  1. 无法解析Intent构造器:你的AsyncGetUsersActivity继承自AsyncTask,而非Context(或Activity)类,AsyncTask本身不属于Context体系,因此AsyncGetUsersActivity.this不能作为Intent所需的Context参数。
  2. 找不到getApplicationContext()方法:同样因为AsyncTask未继承Context类,自然没有这个Context专属方法。

具体解决方案

核心是让AsyncTask持有有效Context引用,同时避免内存泄漏:

步骤1:给AsyncTask添加Context成员变量

通过构造方法传入调用它的Activity的Context,并用WeakReference包装,防止Activity销毁后AsyncTask仍持有引用导致内存泄漏。

步骤2:修改onPostExecute中的启动代码

使用持有的Context创建Intent并启动Activity,先判断Context是否有效。

修改后的完整代码

public class AsyncGetUsersActivity extends AsyncTask<String, String, String> {
    // 用WeakReference持有Context,避免内存泄漏
    private WeakReference<Context> mContextRef;

    // 构造方法传入Context
    public AsyncGetUsersActivity(Context context) {
        mContextRef = new WeakReference<>(context);
    }

    @Override
    protected String doInBackground(String... params) {
        String inputLine = null;
        try {
            URL url = new URL(Config.HOST + "/list/users"); // My URL
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");

            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            inputLine = in.readLine(); // Get my data
            in.close();
        } catch (Exception e) {
            Log.i("pls", "error : " + e.toString());
            e.printStackTrace();
        }
        return inputLine;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        // 获取Context并判断有效性
        Context context = mContextRef.get();
        if (context != null) {
            Intent intent = new Intent(context, SelectAccountActivity.class);
            // 若传入的是ApplicationContext则必须添加该Flag,传入Activity则可省略
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    }
}

调用AsyncTask的方式

在你的Activity中启动任务时,传入当前Activity的Context:

new AsyncGetUsersActivity(this).execute();

额外说明

  • 使用WeakReference是为了避免AsyncTask后台任务未完成时,Activity已销毁引发的内存泄漏。
  • 若传入的Context是Activity,Intent.FLAG_ACTIVITY_NEW_TASK可以省略;若传入的是ApplicationContext,则必须添加该Flag才能启动Activity。

内容的提问来源于stack exchange,提问作者Mura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 08:03:33