Viktor M.
Viktor M.

Reputation: 4623

Android: AsyncTask timeout

Is it possible to do splash screen that will execute HTTP request and if this request is executing too long, i.e. 7-10 seconds, then abort the request and jump to the main activity?

The below code is what I did, but it doesn't work - the timeout isn't working, the HTTP request and jumping are working. As I understand, it's possible to use the AsyncTask's get() method or handler with delay. Get() method should be in separate thread but it doesn't work. How to do this task?

EDIT:

public class SplashActivity extends Activity {
private static final String TAG = "SplashActivity";
private Handler handler = new Handler();
private Runnable r;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash_layout);

    if (Helpers.isNetworkConnected(getApplicationContext())) {
        Log.d(TAG, "Has Internet");
        final DownloadFAQ downloadFAQ = new DownloadFAQ();
        new Thread(new Runnable() {
            public void run() {
                try {
                    Log.d(TAG, "Timing...");
                    downloadFAQ.execute().get(1000, TimeUnit.MILLISECONDS);

                    SplashActivity.this.runOnUiThread(new Runnable() {
                        public void run() {
                            Log.d(TAG, "redirect");
                            redirect();
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    downloadFAQ.cancel(true);
                    Log.d(TAG, "Task has benn canceled");
                    if (downloadFAQ.isCancelled())
                        redirect();
                }
            }
        }).start();
    } else {

        r = new Runnable() {
            public void run() {
                redirect();
            }
        };
        handler.postDelayed(r, 2500);
    }
}

private class DownloadFAQ extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        Log.d(TAG, "Execute task");
        ServerAPI server = new ServerAPI(getApplicationContext());
        server.serverRequest(ServerAPI.GET_FAQ, null);
        return null;
    }
}

private void redirect() {
    Intent i = new Intent(SplashActivity.this, TabsActivity.class);
    startActivity(i);
    finish();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    handler.removeCallbacks(r);
}

}

Upvotes: 2

Views: 16808

Answers (2)

ρяσѕρєя K
ρяσѕρєя K

Reputation: 132982

because you are trying to start AsyncTask again inside doInBackground when it's still running . change your code as to get it work :

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash_layout);
    downloadFAQ = new DownloadFAQ();
    new Thread(new Runnable() {
            public void run() {
                try {
                    downloadFAQ.execute().get(2000, TimeUnit.MILLISECONDS);

                  SplashActivity.thisrunOnUiThread(new Runnable() {
                        public void run() {
                         // start Activity here
                          Intent i = new Intent(SplashActivity.this,
                                                      TabsActivity.class);
                          SplashActivity.this.startActivity(i);
                          SplashActivity.this.finish();
                       }
                  });
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }).start();
}

and you will need to remove downloadFAQ.get(2000, TimeUnit.MILLISECONDS); from doInBackground method change your AsyncTask as

private class DownloadFAQ extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        ServerAPI server = new ServerAPI(getApplicationContext());
        server.serverRequest(ServerAPI.GET_FAQ, null);
        return null;
    }

    protected void onPostExecute(Void result) {

    }

}

Upvotes: 5

Ranco
Ranco

Reputation: 893

consider using asyncTask status: AsyncTask.Status

Upvotes: 0

Related Questions