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
相关产品推荐
相关产品推荐

