gpt4 book ai didi

Android:AsyncTask - 似乎没有异步运行

转载 作者:行者123 更新时间:2023-11-29 16:10:18 26 4
gpt4 key购买 nike

我正在尝试使用 AsyncTask 使 tas 与主线程分开运行,从而防止在任务运行时锁定线程。我是否误解了 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 线程仍然被锁定并崩溃。我在这里误解了什么?

最佳答案

您正在调用 AsyncTask 的 get() 方法,它实际上将异步调用变成了同步调用,因为它等待操作的结果。将 AsyncTask 的结果返回到调用方 Activity 的更好方法是使用回调接口(interface)。创建一个简单的接口(interface),例如:

interface OnTaskCompletedListener {
void onTaskCompleted(Object result);
}

现在在您的 Activity 类中实现该接口(interface):

public class MainActivity extends Activity implements OnTaskCompletedListener {}

现在您应该将 MainActivity 传递给 AsyncTask 对象:

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

AsyncTask 的 onPostExecute() 中,您将结果返回给监听器:

onTaskCompletedListener.onTaskCompleted(result);

现在您可以在 ActivityonTaskCompleted() 方法中使用结果。

希望解释足够清楚,对您有所帮助。

关于Android:AsyncTask - 似乎没有异步运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14021320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com