Android AsyncTask在onPostExecute启动Activity失败,求解决方法
问题解决方法
错误原因分析
- 无法解析Intent构造器:你的
AsyncGetUsersActivity继承自AsyncTask,而非Context(或Activity)类,AsyncTask本身不属于Context体系,因此AsyncGetUsersActivity.this不能作为Intent所需的Context参数。 - 找不到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
相关产品推荐
相关产品推荐

