在搜索了很长时间后,我浏览了以下链接并理解,
http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean)
AsyncTask never executes onPostExecute
但我想对服务器进行一些API点击,在获取所有数据后,我想从Splashscreen转移到我的mainactivity,下面是我的代码。 。 。
class Startsyntask extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... arg0)
{
raw_data = new File(Environment.getExternalStorageDirectory() + "/.MyFoldernew");
if(raw_data.exists())
{
Log.e("directory exists", " already ");
new read_syntask().execute();
}
else
{
Log.e("directory created", " newly ");
raw_data.mkdirs();
new write_syntask().execute();
}
return null;
}
@Override
protected void onPostExecute(Void unused)
{
if( i == 6)
{
finish();
startActivity(new Intent("com.sample.app.Tabbar"));
}
}
}
并且代码read_synctask
和write_synctask
是另一个具有一些特定操作的异步任务,在这些异步任务中,它在doinBackground之后调用onPostexecute。
实际上它移动到Tabbar Activity并且API命中继续,我在Tabbar活动中从服务器读取数据。我怎样才能在doinBackground中完成异步任务之后实现它,应该调用onProgress。
答案 0 :(得分:1)
实际上,
new read_syntask().execute();
和
new write_syntask().execute();
都有异步调用,它们不等待完成任务并执行下一个执行步骤,因此在完成onPostExecute()
之前执行AsyncTask
。< / p>
你要做的是,
使用new read_syntask().execute().get();
和new write_syntask().execute().get();
来自get()
的{{1}}方法将等待完成AsyncTask,然后AsyncTask
将执行。 (但我认为它会阻止UI线程。)
更新:(最佳方法)
实际上,不需要onPostExecute()
AsyncTask,您可以在Activity的方法中直接编写Startsyntask
的 if-else条件,也可以直接编写用于启动raw_data
的代码1}}
Tabbar
应位于finish();
startActivity(new Intent("com.sample.app.Tabbar"));
或read_syntask
的{{1}}。
答案 1 :(得分:0)
引用“我怎样才能在doinBackground中完成异步任务后实现它,应该调用onProgress。”
我不太了解。但也许使用Handler可以提供帮助。在异步任务的onPostExecute之后和处理程序的handleMessage之后发送消息,执行您想要执行的操作。
http://developer.android.com/reference/android/os/Handler.html