0

私はこの例を使用しています:

Android-AsyncTaskのタイムアウトを設定しますか?

次のように:

al.setOnClickListener(new OnClickListener(){
        public void onClick(View w)
        {
            final AlogLoader loader = new AlogLoader();
            loader.execute();
            Handler handler = new Handler();
            handler.postDelayed(new Runnable()
            {
                public void run()
                {
                    if(loader.getStatus() == AsyncTask.Status.RUNNING)
                    {
                        loader.cancel(true);
                    }
                }

            }, 1);      
        }
    });

「1」に設定したのは、起動する前に実際に停止できるかどうか、つまりハンドラーが機能しているかどうかを確認したかったためです。実際には、おそらく15000(15秒)に設定します。

しかし、何が起こるかは混乱を招きます。

アプリケーションを実行すると、onPreExecute()がロード画面を描画しますが、これは決して終了しないため、ユーザーにはロード画面が永続的に表示されます。

loader.cancel(true)->にブレークポイントを設定してデバッガーで実行すると、デバッガーはその行で停止します。これは、1ミリ秒しか実行できないために予想されます。しかし、その後デバッガーで再開ボタンを押すと、onPostExecute()が呼び出されます...どうしてそれが可能ですか?

明らかに、私は非同期タスクのタイムアウトに非常に慣れていません-いくつかの調査の後、上記の例を見つけました、そしてそれは間違いなくloader.get(15000、TimeUnit.MILLISECONDS);よりも私にとって最も理にかなっているようでした。 UIスレッド。

どんな助けでもありがたいです...プロセスの説明さえ。

4

1 に答える 1

0

さて、それで私は本質的に私の問題を解決しました、しかし私はまだ混乱しています...それがすべて良いかどうかわかりません。

loader.cancel(true)が実際にどのように機能するのかわかりませんでした。APIレベルに基づいて(この質問を読んでください:cancel(true)の後に呼び出されないAsyncTask.onCancelled())、AsyncTaskにonCancelled()またはonCancelled(params)メソッド、あるいはその両方が必要です。

私はこれを持っていなかったので、これは私がロード画面を永遠に見た理由を説明しています。大丈夫です。

それでも、デバッガーでどのようにonPostExecute()を呼び出すことができたかは説明されていません。これは、Android APIによると、cancel(true)が呼び出されるとonPostExecuteが呼び出されないためです...

答えは次のとおりです。 これをAsyncTaskに追加します-

    @Override
    protected void onCancelled()
    {
        Toast.makeText(FriendsActivity.this,"Blah- reason", Toast.LENGTH_LONG).show();
        loadingScreen.dismiss();
    }
于 2013-03-24T20:40:41.600 に答える