0

AsyncTasks でコールバックを使用する方法を理解しようとしています。これは、タスクから更新する方法の標準のように思われるためです...問題は、オンラインのリソースがそれについて話すのではなく、「これをやればうまくいく」と言います。

私が持っているものについて話し合うつもりです.誰かが私がどこで間違っているのか/正確に何をすべきかを教えてくれたら、私はそれを感謝します.

OnTaskCompleted私はそれ自身のファイルで呼び出されるインターフェースを持っています:

OnTaskCompleted:

package com.example;

public interface OnTaskCompleted{
    void onTaskCompleted(boolean result);
}

次に、いくつかのメソッドを含む別のタスクと、私のAsyncTask:

接続ユーティリティ:

public class ConnectUtils implements OnTaskCompleted {

    private boolean hasConnected, hasChecked;

    public boolean isConnected(Context parent, String url){ 
        hasChecked = false;
        new CheckURL(parent, new OnTaskCompleted(){
            @Override
            public void onTaskCompleted(boolean result) {
                // TODO Auto-generated method stub

            }}, url).execute();
        while(!hasChecked){ Log.i("Checked?", hasChecked + ""); }
        return hasConnected;
    }

    private class CheckURL extends AsyncTask<Void, Void, Boolean>{

        private Context parent;
        private OnTaskCompleted listener;
        private String url;

        public CheckURL(Context parent, OnTaskCompleted listener, String url){
            this.parent = parent;
            this.listener = listener;
            this.url = url;
        }

        @Override
        protected Boolean doInBackground(Void... params){
            // Do some stuff and return a boolean
        }

        @Override
        protected void onPostExecute(Boolean result){
            super.onPostExecute(result);
            listener.onTaskCompleted(result);
        }
    }


    @Override
    public void onTaskCompleted(boolean result) {
        Log.i("Completed", result + "");
        hasConnected = result;
        hasChecked = true;
    }
}

私が期待しているのは、AsynTask からの結果がない間にwhileinが実行され、Task が終了すると true に設定され、while ループが停止することです。isConnected()hasChecked

私が見ているのは、ループが無限に続き、常に false をログに記録しているため、hasChecked更新されていないということです。

どこで、なぜ私が間違っているのか、誰でも説明できますか?

おそらく、このコード内ではなく、コールバックが一般的にどのように機能するかに関心があることに注意してください (ただし、このコードを使用して説明します)。これは単なるコード例です。

4

2 に答える 2

1

使用のポイントはAsyncTasks、一部の処理が の非 UI スレッドで行われている間に、UI スレッドを他のアクティビティに解放することAsyncTaskです。

ただし、コードでは、UI スレッド (優先度を取得する) がwhile()ループにロックされ、非 UI スレッド (優先度を取得しない) がAsyncTask.

より良いアプローチは、別の流れです。まず、接続を開始します。

public void ensureConnected(Context parent, String url){ 
    new CheckURL(parent, new OnTaskCompleted(){
        @Override
        public void onTaskCompleted(boolean result) {
            isChecked   = true;
            isConnected = result;

            // Change of state actions called from here
        }}, url).execute();
}

そしてでAsyncTask

private class CheckURL extends AsyncTask<Void, Void, Boolean>{
    private Context parent;
    private OnTaskCompleted listener;
    private String url;

    public CheckURL(Context parent, OnTaskCompleted listener, String url){
        this.parent = parent;
        this.listener = listener;
        this.url = url;
    }

    @Override
    protected Boolean doInBackground(Void... params){
        // Do some stuff and return a boolean
    }

    @Override
    protected void onPostExecute(Boolean result){
        super.onPostExecute(result);
        listener.onTaskCompleted(result);
    }
}

最後に、なぜ here が必要なのかまったくわかりませんInterface: (この単純なサンプル コードに関する限り) 完全になくして、状態変数を設定し、状態変更アクションを で直接トリガーすることができますonPostExecute

于 2013-08-26T00:20:47.110 に答える
0

これが asynctask コールバックの仕組みです

  1. 最初に onPreExecute() が呼び出され、UI スレッドで効果的に実行されるため、スレッドが開始する前にここでいくつかの UI アクティビティを実行できます。たとえば、ここで進行状況ダイアログを開始できます。

  2. 次に doInBackgound() が呼び出され、スレッド作業がバックグラウンドで実行されます。中間値で関数 publishProgress(int) を呼び出すことにより、中間結果を UI スレッドに発行できます。

  3. 中間値は onPublishProgress() から UI スレッドにポストされます。

  4. doInBackground() の戻り値は、最終的に onPostExecute() によって取得されます。このコールバックも UI スレッドで効果的に実行され、asysntask の結果に基づいて UI スレッドの最終的な作業を行います。

詳細については、以下のリンクを確認してください。

http://developer.android.com/reference/android/os/AsyncTask.html

これがお役に立てば幸いです

于 2013-08-26T00:18:56.627 に答える