1

AsyncTask を使用してタスクをメインスレッドとは別に実行しようとしているため、タスクの実行中にスレッドがロックされるのを防ぎます。AsyncTask の使用法を誤解していませんか?

メインスレッドからの呼び出しコード:

public void onClick(View view) {
    int input = Integer.parseInt(editInput.getText().toString());
    String out = "";

    try {
        out = new RunAsyncTask().execute(Integer.toString(input)).get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }

AsyncTask クラスから:

protected String doInBackground(String... params) {
    long start, stop;
    long result;
    String out = "";
    int input = Integer.parseInt(params[0]);

    // Dalvik (Java) - Recursive:
    start = System.currentTimeMillis();
    result = FibLib.fibJR(input);
    stop = System.currentTimeMillis(); 
    out += String.format("Dalvik (Java) recursive: %d (%d msec)", result, stop - start);

    // Dalvik (Java) - Iterative:
    start = System.currentTimeMillis();
    result = FibLib.fibJI(input);
    stop = System.currentTimeMillis();
    out += String.format("\nDalvik (Java) iterative: %d (%d msec)", result, stop - start);

    return out

FibLib クラス (AsyncTask によって呼び出される) から:

public class FibLib {
    public static long fibJR(long n) {  // 
        if (n <= 0) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }

        return fibJR(n - 1) + fibJR(n - 2);
    }

    // Java implementation - iterative:
    public static long fibJI(long n) { // 
        long previous = -1;
        long result = 1;

        for (long i = 0; i <= n; i++) {
            long sum = result + previous;
            previous = result;
            result = sum;
        }

        return result;
    }   

ただし、これを実行すると、メインの GUI スレッドがロックされたままになり、タスクが小さくて速いタスク以上のものである場合はクラッシュします。ここで私は何を誤解していますか?

4

1 に答える 1

4

の get() メソッドを呼び出していますAsyncTask。これは、操作の結果を待機するため、実際には非同期呼び出しを同期呼び出しに変えます。AsyncTaskの結果を呼び出し元に返すより良い方法Activityは、コールバック インターフェイスを使用することです。簡単な を作成しますinterface。例:

interface OnTaskCompletedListener {
    void onTaskCompleted(Object result);
}

Activityそのインターフェイスをクラスに実装します。

public class MainActivity extends Activity implements OnTaskCompletedListener {}

MainActivityAsyncTaskオブジェクトに渡す必要があります。

AsyncTask task = new RunAsyncTask(onTaskCompletedListener).execute();

内部ではAsyncTask's onPostExecute()、結果をリスナーに返します。

onTaskCompletedListener.onTaskCompleted(result);

Activityこれで、結果をのonTaskCompleted()メソッドで使用できます。

説明が十分に明確であり、役立つことを願っています。

于 2012-12-24T12:30:14.730 に答える