1

レイアウトに画像のみが含まれるスプラッシュ画面のアクティビティがあります。スプラッシュ画面がUIスレッドに表示されている間に、バックグラウンドでいくつかのHttp呼び出しを行いたい。しかし、AsyncTaskを実行すると、レイアウト内の画像が表示されません。レイアウト自体が読み込まれていないと思わせる空白の画面しか表示されません。以下はアクティビティコードです。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_screen);
        String authReqResponse;
        Toast errorDisplayToast = new Toast(this);

        AuthorizationRequest authReq = new AuthorizationRequest();
        authReq.execute(new Void[] {});

        try {
            authReqResponse = authReq.get();
            if(authReqResponse.equalsIgnoreCase(GeneralConstants.AUTH_FAILED_ERROR)) {
                errorDisplayToast.makeText(SplashScreen.this, R.string.request_auth_failed_error_message, Toast.LENGTH_LONG);
                errorDisplayToast.show();
            } else if(authReqResponse.equalsIgnoreCase(null)) {
                errorDisplayToast.makeText(SplashScreen.this, R.string.networkErrorMessage, Toast.LENGTH_LONG);
                errorDisplayToast.show();
            } else {
                GeneralConstants.REQ_TOKEN = authReqResponse;
                Intent startARIntent = new Intent(SplashScreen.this, MainActivity.class);
                startActivity(startARIntent);
                finish();
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
}
4

2 に答える 2

1

ここ

try {
       authReqResponse = authReq.get();///<<get method of AsyncTask

           //your code....

AsyncTaskについてのドキュメントと同じくらい。get(長いタイムアウト、TimeUnit単位):

必要に応じて、計算が完了するまで最大で指定された時間待機してから、その結果を取得します。

つまり、このメソッドを使用してAsyncTaskからUIメインスレッドに結果を戻すと、結果がAsyncTaskのdoInBackgroundメソッドから返されないまでメインUIの実行が停止します。

ソリューションはonPostExecute、AsyncTaskの実行が完了したときにUI要素を更新するために使用されます

于 2012-12-22T04:17:23.063 に答える
0

これは、AsyncTaskと対話するための非常に奇妙な方法です。あなたはそれがexecute()ノンブロッキングであることに気づいていますよね?ブロックは、のtry直後に実行されますexecute。さらに、authReqタスクの実行が完了すると、は未定義になります。インスタンスのリスナーでそのビットを書き直す必要がありActivityます。

第二に、あなたはただauthReq.execute()、それを無効にすることができます。

最後に、スプラッシュスクリーンをデバッグするには、次のように縮小します。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_screen);
}

そして、それが機能することを確認します。次に、修正をAsyncTask続行して、承認リクエストの結果をActivityonPostExecuteに通知します。

于 2012-12-22T04:17:25.160 に答える