为什么AsyncTask doInBackground没有运行,但第二次它运行

时间:2016-03-20 21:33:55

标签: java android android-asynctask

所以我是新手,我需要调用从单独文件运行AsyncTask的函数。

MainActivity.java代码

public class MainActivity extends AppCompatActivity {
String res;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Asynctasktest newAsy = new Asynctasktest();



    res = newAsy.ValidateUser();

    Toast.makeText(getBaseContext(), "'"+res+"'", Toast.LENGTH_LONG).show();
}

}

和AsyncTaskTest.java代码

public class Asynctasktest extends MainActivity {

String Res;

private class GetFWork extends AsyncTask<Void,Void,String> {

    @Override
    protected void onPreExecute() {
        Res = "onPreExecute";
    }

    @Override
    protected String doInBackground(Void... param) {

        return "am i here";
    }

    @Override
    protected void onPostExecute(String Result) {
        super.onPostExecute(Result);
        Res = Result;
    }
}

public String ValidateUser(){

    final GetFWork Fl = new GetFWork();

    Fl.execute();

    return Res;
}


}

所以我需要得到文字&#34;我在这里&#34;,但是我得到了#24; onPreExecute&#34;,这表明在第一次调用时它不会做doInBackground。

3 个答案:

答案 0 :(得分:1)

这就是AsyncTask的工作原理。

res = newAsy.ValidateUser();
Toast.makeText(getBaseContext(), "'"+res+"'", Toast.LENGTH_LONG).show();

都是同时执行的,因此 - 由于AsyncTask是异步的 - res的值仍然是“onPreExecute”。

答案 1 :(得分:0)

Wukash提出的好处。只是详细说明。当ValidateUser()返回Res时,无法保证AsyncTask已完成运行,因为它是异步的,并且运行主线程。因此,在您的情况下,它会返回null,因为Res永远不会更新。

如果您需要返回值result来更新UI或其他内容,请将处理程序函数引用作为回调发送,并使其成功。

如果您需要进一步说明,请与我们联系。我记得在我第一次实施AysncTask时遇到了类似的问题。

答案 2 :(得分:0)

尝试在此方法中调用super

@Override
protected void onPreExecute() {
    super.onPreExecute();
    Res = "onPreExecute";
}

另外请记住,您不能两次调用相同的AsyncTask对象,否则您将收到此错误:

Cannot execute task: the task has already been executed (a task can be executed only once)

因此,您在ValidateUser()方法中创建新GetFWork()的方法很好。