我正在尝试使用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线程仍然被锁定并崩溃。我在这里误解了什么?
答案 0 :(得分:4)
你正在调用AsyncTask
的get()方法,它实际上将异步调用转为同步,因为它等待操作的结果。将AsyncTask
的结果返回给调用Activity
的更好方法是使用回调接口。创建一个简单的interface
,例如:
interface OnTaskCompletedListener {
void onTaskCompleted(Object result);
}
现在在Activity
类中实现该接口:
public class MainActivity extends Activity implements OnTaskCompletedListener {}
现在您应该将MainActivity
传递给AsyncTask
对象:
AsyncTask task = new RunAsyncTask(onTaskCompletedListener).execute();
在AsyncTask's onPostExecute()
内部,您将结果返回给侦听器:
onTaskCompletedListener.onTaskCompleted(result);
现在,您可以在Activity
的{{1}}方法中使用结果。
希望解释清楚,它会对你有帮助。