【发布时间】:2019-11-15 21:54:53
【问题描述】:
如何在后台任务中从 Java Android 中的 AsyncTask void onPostExecute() 方法返回结果? 当 Delegate Pattern Save My Life 救了我的命时,我花了很多天来搜索它。什么时候从 StackOverFlow 在这里找到的。
我的主线程有一个 CsvUtil.getCompanies() 方法需要返回一个 List,getCompanies() 调用一个 ReadLine 类来使用来自 Cloud 的 Google Sheet。
public static final class ParseLine extends AsyncTask<String, Integer, String[]> {
private TaskDelegate delegate;
public ParseLine(TaskDelegate delegate) {
this.delegate = delegate;
}
public interface TaskDelegate {
public void onTaskEndWithResult(String[] parseLine);
}
@Override
protected String[] doInBackground(String... nextLine) {
try {
return parseLine(nextLine[0]);
} catch (IOException ex) {
Log.e("CsvReader", ex.getMessage());
}
return null;
}
@Override
protected void onPostExecute(String[] parseLine) {
if (parseLine != null && delegate != null)
delegate.onTaskEndWithResult(parseLine);
}
}
private static final class GetNextLine extends AsyncTask<Void, Integer, String>
implements ParseLine.TaskDelegate {
private List<String[]> list;
public GetNextLine(List<String[]> l) {
list = l;
}
@Override
protected String doInBackground(Void... companies) {
try {
return getNextLine();
} catch (IOException ex) {
Log.e("CsvReader", ex.getMessage());
}
return null;
}
@Override
protected void onPostExecute(String nextLine) {
if (nextLine != null) {
ParseLine parseLine = new ParseLine(this);
parseLine.execute(nextLine);
}
}
@Override
public void onTaskEndWithResult(String[] parseLine) {
list.add(parseLine);
}
}
【问题讨论】:
-
什么时候需要使用后台任务和委托模式?
-
onPostExecute在 UI 线程上被调用,它基本上是一个回调,当doInBackground完成时调用,不管有没有结果。不清楚你想在这里实现什么。 -
所以,我需要将结果从 void onPostExecute 返回到我的主线程,从两个后台线程传递。
-
如果您启动 2
AsyncTasks,那么两者都会在他们的onPostExecute方法中为您提供结果。在那里你可以得到你的结果并更新 UI。
标签: java android multithreading design-patterns delegates