问题
After searching for a long , i went through the following links and understood ,
http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean)
AsyncTask never executes onPostExecute
But i want to do some API hits to the server and after getting all the data , i want to move to my mainactivity from the Splashscreen , below is my code . . . .
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"));
}
}
}
and in the code read_synctask
and write_synctask
are another asyncronous tasks that has some specific operations to do with , in these Asyncronous tasks it is calling the onPostexecute after doinBackground .
Actually it moves to the Tabbar Activity and the API hits continues and i get data read from server in Tabbar activity . how could i implement that only after completing the asyncronous task in doinBackground , onProgress should be called .
回答1:
Actually,
new read_syntask().execute();
and
new write_syntask().execute();
both have Asynchronous call which don't wait for complete the task and perform the next execution step, so your execution comes to onPostExecute()
before finishes both AsyncTask
.
What you have to do is,
use new read_syntask().execute().get();
and new write_syntask().execute().get();
Now get()
method from AsyncTask
will wait for complete the AsyncTask and then onPostExecute()
will execute. (But I think it will block the UI thread).
Update: (Best approach)
Actually, there is no need of Startsyntask
AsyncTask, You can directly write the if-else conditions of raw_data
in Activity's method and also your code for starting Tabbar
finish();
startActivity(new Intent("com.sample.app.Tabbar"));
should be in either read_syntask
or write_syntask
's onPostExecute()
.
回答2:
Quoting "how could i implement that only after completing the asyncronous task in doinBackground , onProgress should be called ."
I don't know much. But maybe using Handler can help. Send a message after the onPostExecute of the asynchronous task and on handleMessage of your handler, do what you want to do.
http://developer.android.com/reference/android/os/Handler.html
来源:https://stackoverflow.com/questions/14869347/onpostexecute-executes-before-doinbackground-in-asyncronous-task