所以我是新手,我需要调用从单独文件运行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。
答案 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()的方法很好。