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

AsyncTask onPostExecute传值至Activity构造器后TextView显示为空问题

问题原因分析与解决方案

核心问题:你错误地手动创建了Activity实例

Android的Activity是由系统统一管理生命周期的组件,你不能通过new Answer(s)这种方式直接创建Activity对象!你手动new出来的那个Answer实例只是一个普通Java对象,根本不会被系统启动、显示在屏幕上,也不会执行onCreate方法。而实际被系统启动并展示的Answer Activity,是系统通过无参构造器创建的全新实例——这就是为什么你在自定义构造器里能打印字符串,但onCreate里的str是空的原因。

正确的Activity间传值方式:使用Intent传递数据

这是Android组件间传递数据的标准做法,步骤如下:

1. 在AsyncTask的onPostExecute中启动Answer Activity并传递数据

修改你的AsyncTask代码,用Intent携带字符串启动Activity:

@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
    Log.d("Answer1", s);
    // 创建Intent,指定当前Activity和目标Answer Activity
    Intent intent = new Intent(YourCurrentActivity.this, Answer.class);
    // 把字符串存入Intent的Extra,KEY_ANSWER是自定义的键名
    intent.putExtra("KEY_ANSWER", s);
    // 启动Activity
    startActivity(intent);
}

注意:把YourCurrentActivity替换成你当前执行AsyncTask的那个Activity的类名

2. 在Answer Activity的onCreate中获取传递的数据

修改Answer Activity的代码,从Intent中取出字符串并设置到TextView:

public class Answer extends AppCompatActivity {
    TextView textView;
    String str;

    // 必须保留无参构造器,系统创建Activity实例时会用到它
    public Answer() {}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_answer);
        textView = findViewById(R.id.SetSteps);

        // 从Intent中获取传递的字符串
        if (getIntent() != null) {
            str = getIntent().getStringExtra("KEY_ANSWER");
            Log.d("Answer2", str);
            textView.setText(str);
        }
    }
}

额外说明

  • 永远不要手动用new创建Activity、Service等Android组件实例,它们的生命周期完全由系统控制,手动创建的实例不会被系统识别,也无法正常工作。
  • Intent的Extra可以传递多种类型的数据,除了字符串,还支持基本数据类型、序列化对象等,是组件间通信的首选方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:37:29