Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从onpostexecute发送值_Java_Android_Android Asynctask - Fatal编程技术网

Java 从onpostexecute发送值

Java 从onpostexecute发送值,java,android,android-asynctask,Java,Android,Android Asynctask,我正在使用AsyncTask执行后台任务,在完成任务后,我想将onPostExecute方法的结果字符串设置为另一个活动的构造函数,并从那里将该字符串设置为TextView。当我在构造函数中打印日志时,它正在打印字符串,但当我在textview上设置相同的字符串时,它会给出空字符串。(在textview上设置的字符串是空的,所以它不会打印任何内容。) 我的任务代码: @Override protected void onPostExecute(String s) { super.onPos

我正在使用AsyncTask执行后台任务,在完成任务后,我想将onPostExecute方法的结果字符串设置为另一个活动的构造函数,并从那里将该字符串设置为TextView。当我在构造函数中打印日志时,它正在打印字符串,但当我在textview上设置相同的字符串时,它会给出空字符串。(在textview上设置的字符串是空的,所以它不会打印任何内容。)

我的任务代码:

@Override
protected void onPostExecute(String s) {
   super.onPostExecute(s);
   Log.d("Answer1",s);
   new Answer(s);
}
我的回答活动,在该活动中,我通过构造函数设置字符串,并在textview上设置该字符串的值,但该字符串为空

public class Answer extends AppCompatActivity {

    TextView textView;

    String str;

    //  Dont Delete this
    Answer(){

    }

    // Here, Log will print right string, but not on textview
    Answer(String str){
        this.str = str;
        Log.d("Answer2",this.str);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_answer);

        textView = findViewById(R.id.SetSteps);

        // The String set here is empty, can you please elaborate???
        textView.setText(str);
    }

}

你应该永远不要自己实例化一项活动。正确的方法是通过意图将所需数据传递给新活动:

@Override
protected void onPostExecute(String s) {
   super.onPostExecute(s);
   Intent intent = new Intent(CurrentActivity.this, Answer.class);
   intent.putExtra("MY_DATA", s);
   startActivity(intent);
}
然后在回答活动中,您可以收到以下值:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_answer);

        textView = findViewById(R.id.SetSteps);
        String result = getIntent().getExtras().getString("MY_DATA","");

        textView.setText(result);
    }

1-将上下文变量添加到AsyncTask中

Context context = getApplicationContext();
2-在onPostExecute中,创建新的意图,将字符串添加到意图中并启动活动:

Intent intent = new Intent(context, Answer.class);
intent.putExtra("Answer1",s);
context.startActivity(intent);
3-在回答活动中,您可以从以下意图中获取字符串:

Intent intent = getIntent();
String answer = intent.getStringExtra("Answer1");
if(answer !=null){
// do what you want
}

PS:请从您的活动中删除构造函数,不建议这样做

这根本不是Android的工作方式。Android框架永远不会调用接受参数的构造函数,你也不应该自己创建一个新的活动。要将参数传递给活动,请在传递给
startActivity
的意图上使用附加。它打印从onpostexecute方法获得的字符串,但我无法在oncreate中访问它。我有一个问题,如果我从onpostexecute发送意图,android不会只在一个线程上运行吗?那么为什么我需要使用AsyncTask,我需要从主线程运行UI并通过AsyncTask设置数据。可能吗?我的意思是,我需要通过主UI线程发送意图,并通过AsynTask发送数据。当您完成工作时,会调用OnPostExecute,您需要异步任务,因为doInBackground方法将在后台线程中完成您的工作。PostExecute中的代码再次在主线程中执行,这正是因为您需要访问异步任务生成的内容。