2015-04-06 3 views
1

Я пытаюсь научиться работать с 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; 
    } 


} 

ответ

2

Проблема заключается в том: пытается вернуть массив через onPostExecute Я получение ошибки аргументов; он не будет принимать массив

Вам необходимо пройти массив строк в качестве последнего общего аргумента AsyncTask который является возвращение типа doInBackground и тип аргумента onPostExecute.

выполнить следующие изменения:

1. продлить AsyncTask как:

public class DownloaderTask extends AsyncTask<Integer, Void, String[]> 

2. Изменить doInBackground метод возвращения типа из String в String[]:

@Override 
    protected String[] doInBackground(Integer... params) { 
     downloadTweets(params); 
     return downloadTweets(params); 
    } 

3. Изменить onPostExecute тип параметра Я от String до String[]:

protected void onPostExecute(String[] s) { 
     super.onPostExecute(s); 
     mCallback.notifyDataRefreshed(s); //trying to send back feeds 
    } 
+0

спасибо. Я попытался использовать 'String ... ', и это дало мне всевозможные ошибки. «String []», похоже, позаботился об этом, а также о других предлагаемых исправлениях. – DevJem

+0

Могу ли я получить разъяснения по пункту 2? Если вы вызываете 'downloadTweets (params); return downloadTweets (params); 'который вызовет метод дважды, не так ли? – DevJem

+0

@Dithanial: Да, возвращает String [] Массив из 'doInBackground', который возвращается из метода downloadTweets –

1

Вы должны пройти String[], как последний аргумент в вашем AsyncTask не только String, как вы делаете, и ваш AsyncTask должен выглядеть примерно так:

public class DownloaderTask extends AsyncTask<Integer, Void, String[]> { 

    @Override 
    protected String[] doInBackground(Integer... params) { 
     return downloadTweets(params);; 
    } 

    @Override 
    protected void onPostExecute(String[] s) { 
     super.onPostExecute(s); 
     mCallback.notifyDataRefreshed(s); //trying to send back feeds 
    } 
} 
+0

Также необходимо изменить тип возвращаемого значения метода doInBackground' из 'String' в' String [] ' –

Смежные вопросы