2

HTTPリクエストを実行するスプラッシュ画面を実行することは可能ですか?このリクエストの実行時間が長すぎる場合(7〜10秒)、リクエストを中止してメインアクティビティにジャンプしますか?

以下のコードは私が行ったことですが、機能しません-タイムアウトが機能せず、HTTPリクエストとジャンプが機能しています。私が理解しているように、AsyncTaskget()メソッドまたはハンドラーを遅延して使用することは可能です。Get()メソッドは別のスレッドにある必要がありますが、機能しません。このタスクを実行する方法は?

編集:

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);
}

}

4

2 に答える 2

5

doInBackgroundAsyncTaskがまだ実行されているときに、内部で AsyncTask を再度開始しようとしているためです。コードを変更して動作させます:

@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();
}

downloadFAQ.get(2000, TimeUnit.MILLISECONDS);doInBackground メソッドから削除して、AsyncTask を次のように変更する必要があります。

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) {

    }

}
于 2013-01-31T10:34:47.453 に答える
0

asyncTask ステータスの使用を検討してください: AsyncTask.Status

于 2013-01-31T10:20:29.273 に答える