Я пытаюсь научиться работать с AsyncTask. У меня есть код в doInBackground
, который возвращает массив String и обратный вызов, который вызывает интерфейс, чтобы вернуть его в MainActivity. Я успешно выполняю AsyncTask.Переопределение onPostExecute() в AsyncTask
Проблема заключается в следующем: попытка вернуть массив через onPostExecute У меня возникает ошибка аргументов; он не примет массив. Как использовать метод onPostExecute
для возврата значения feeds
? Я попытался изменить результат doInBackground
, но это тоже не приняло бы массив.
Вот интерфейс, называемый в MainActivity:
interface DownloadFinishedListener {
void notifyDataRefreshed(String[] feeds);}
Вот обратного вызова:
try {
mCallback = (DownloadFinishedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement DownloadFinishedListener");
}
и здесь является AsyncTask:
public class DownloaderTask extends AsyncTask<Integer, Void, String> {
@Override
protected String doInBackground(Integer... params) {
downloadTweets(params);
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
mCallback.notifyDataRefreshed(s); //trying to send back feeds
}
// Simulates downloading Twitter data from the network
private String[] downloadTweets(Integer resourceIDS[]) {
final int simulatedDelay = 2000;
String[] feeds = new String[resourceIDS.length];
try {
for (int idx = 0; idx < resourceIDS.length; idx++) {
InputStream inputStream;
BufferedReader in;
try {
// Pretend downloading takes a long time
Thread.sleep(simulatedDelay);
} catch (InterruptedException e) {
e.printStackTrace();
}
inputStream = mContext.getResources().openRawResource(
resourceIDS[idx]);
in = new BufferedReader(new InputStreamReader(inputStream));
String readLine;
StringBuffer buf = new StringBuffer();
while ((readLine = in.readLine()) != null) {
buf.append(readLine);
}
feeds[idx] = buf.toString();
if (null != in) {
in.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
return feeds;
}
}
спасибо. Я попытался использовать 'String ... ', и это дало мне всевозможные ошибки. «String []», похоже, позаботился об этом, а также о других предлагаемых исправлениях. – DevJem
Могу ли я получить разъяснения по пункту 2? Если вы вызываете 'downloadTweets (params); return downloadTweets (params); 'который вызовет метод дважды, не так ли? – DevJem
@Dithanial: Да, возвращает String [] Массив из 'doInBackground', который возвращается из метода downloadTweets –