0

Async タスクから結果を取得したい。task.execute.get を使用すると、UI がフリーズします。Async タスクをスタンドアロン クラスにしたいので、結果処理コードを onPostExecute に入れたくありません。ここで非同期タスクからのコールバックデータに関するいくつかの情報を見つけました: http://blog.evoxmusic.fr/content/how-implement-callback-asynctask
とここ: Android asynctask は ui にコールバックを送信します
が、問題は: 1-結果を処理するタイミングがわかりません。2-なぜインターフェースを使うのか? 3-onPostExecute から Async タスクの public フィールドに結果を単に入れるだけでインターフェイスを使用することの違いは何ですか?

これは私の非同期クラスです:

public class AsyncCallWs extends AsyncTask<String, Void, String> {

    private ProgressDialog dialog;
    public String methodName="";
    private WebService ws;
    private ArrayList<ServiceParam> paramsList;
    private boolean hasParams; 

    public AsyncCallWs(Activity activity,String methodName) {
        xLog.position();
        try {
            this.dialog = new ProgressDialog(activity);
            this.methodName = methodName;
            hasParams = false;
        } catch (Exception e) {
            xLog.error(e.getMessage());
        }
    }

    public AsyncCallWs(Activity activity,String methodName,ArrayList<ServiceParam> params) {
        xLog.position();
        try {
            this.dialog = new ProgressDialog(activity);
            this.methodName = methodName;
            this.paramsList = params;
            hasParams = true;
        } catch (Exception e) {
            xLog.error(e.getMessage());
        }
    }


    @Override
    protected void onPreExecute() {
        this.dialog.setMessage(PersianReshape.reshape("Loading..."));
        this.dialog.show();
    }

    @Override
    protected String doInBackground(String... params) {
        xLog.position();
        String result = "No async task result!";
        try {
            ws = new WebService(PublicVariable.NAMESPACE, PublicVariable.URL);
            if (!hasParams){
                result = ws.CallMethod(methodName);
            }
            else{
                xLog.info("THIS METHOD IS: "+ methodName);
                result = ws.CallMethod(methodName,paramsList);
                xLog.info("THIS RESULT IS: "+ result);
            }
        } catch (Exception e) {
            xLog.error(e.getMessage());
        }
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        xLog.position();

        if (this.dialog.isShowing()) {
            this.dialog.dismiss();
        }
        xLog.info("Output of current AsyncTask is:"+ result);
    }
}
4

2 に答える 2

1

1-いつ結果を処理するかわからない?

結果は で処理されonPostExecute、このインターフェイスを実装しているクラスでインターフェイス メソッドが呼び出されます。したがって、実際の UI はすべて、インターフェイス コールバックを実装している、または何でも実行されますActivityFragment必要なデータを渡すことができます。

2-なぜインターフェースを使うのか?

インターフェースは、それを実装しているクラス (またはAsyncTaskと仮定します) からロジックを分離するための優れた方法です。また、これは、このインターフェースを実装するすべてのクラスが this からの結果を処理できることを意味し、簡単に再利用できるようになります。ActivityFragmentAsyncTask

3-onPostExecute から Async タスクの public フィールドに結果を単に入れるだけでインターフェイスを使用することの違いは何ですか?

あなたはまだコールバックを受け取りません -このフィールドに値が入力され、問い合わせの準備ができたことを、あなたActivityまたはあなたはどのように知ることができますか?Fragment

于 2013-12-10T11:12:06.297 に答える