2015-09-27 3 views
0

Вот моя проблема. У меня есть следующий код для AsyncTask:Обработка дублирующих элементов AsyncTask при обновлении

private class BackgroundAsyncTask extends AsyncTask<String, Void, Integer> { 

    OkHttpUtil okHttp = new OkHttpUtil(); 

    private static final int RESULT_FAILURE = 0; 
    private static final int RESULT_SUCCESS = 1; 
    private static final int RESULT_DATA_ADDED = 2; 

    private static final String TAG_SUCCESS = "success"; 
    private static final String TAG_ARRAY = "articles"; 

    private static final String url = "http://x/db/fetch_all.php"; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     if (mSwipeRefreshLayout != null) { 
      mSwipeRefreshLayout.setRefreshing(true); 
     } 
    } 

    @Override 
    protected Integer doInBackground(String... params) { 
     int result = 0; 
     try { 
      JSONObject jsonObject = new JSONObject(okHttp.okHttpGet(url)); 
      result = jsonObject.optInt(TAG_SUCCESS); 
      if (result == RESULT_SUCCESS) { 
       JSONArray jsonArray = jsonObject.optJSONArray(TAG_ARRAY); 
       for (int i = 0; i < jsonArray.length(); i++) { 
        JSONObject jsonArticle = jsonArray.optJSONObject(i); 
        int id = jsonArticle.optInt(NewsletterHContract.FavoritesColumns.ID); 
        String img = jsonArticle.optString(NewsletterHContract.FavoritesColumns.IMG); 
        String title = jsonArticle.optString(NewsletterHContract.FavoritesColumns.TITLE); 
        String content = jsonArticle.optString(NewsletterHContract.FavoritesColumns.CONTENT); 
        mArticleList.add(new Article(id, img, title, content)); 
        result = RESULT_DATA_ADDED; 
       } 

      } 

     } catch (Exception e) { 
      Timber.e(e, "Error parsing JSON Object"); 
     } 
     return result; 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     super.onPostExecute(result); 
     if (result == RESULT_DATA_ADDED) { 
      mRecyclerView.getAdapter().notifyDataSetChanged(); 
     } 
     if (mSwipeRefreshLayout != null) { 
      mSwipeRefreshLayout.setRefreshing(false); 
     } 
    } 

} 

AsyncTasks оказался для меня совершенно новым. Теперь дело в том, когда пользователь обновляется, я в настоящее время выполняю new BackgroundAsyncTask().execute().

Что это значит, это снова добавляет то же содержимое в мой RecyclerView. Есть ли способ, которым я могу выполнить эти вещи:

  • Обнаруживать добавление новых данных без сравнения текущего выбранного элемента со всеми элементами списка массивов, чтобы узнать, являются ли данные устаревшими.
  • Предотвращение повторного запуска AsyncTask при изменении ориентации экрана.

Позвольте мне упомянуть, что я выполняю AsyncTask в onCreateView() моего фрагмента.

ответ

0

Вы думали очистить ArticleList, добавив

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    if (mSwipeRefreshLayout != null) { 
     mArticleList.clear(); 
     mSwipeRefreshLayout.setRefreshing(true); 
    } 
} 

или если вы хотите добавить вещи, которые не представляют вы могли бы сделать

// add this function to your class 
public boolean hasArticleInList(int id) 
{ 
    for(Article a : mArticleList){ 
    if(a.getId == id){return true;} 
    } 
    return false; 
} 


@Override 
protected Integer doInBackground(String... params) { 
    int result = 0; 
    try { 
     JSONObject jsonObject = new JSONObject(okHttp.okHttpGet(url)); 
     result = jsonObject.optInt(TAG_SUCCESS); 
     if (result == RESULT_SUCCESS) { 
      JSONArray jsonArray = jsonObject.optJSONArray(TAG_ARRAY); 
      for (int i = 0; i < jsonArray.length(); i++) { 
       JSONObject jsonArticle = jsonArray.optJSONObject(i); 
       int id = jsonArticle.optInt(NewsletterHContract.FavoritesColumns.ID); 
       String img = jsonArticle.optString(NewsletterHContract.FavoritesColumns.IMG); 
       String title = jsonArticle.optString(NewsletterHContract.FavoritesColumns.TITLE); 
       String content = jsonArticle.optString(NewsletterHContract.FavoritesColumns.CONTENT); 


     //CHANGE THIS BIT TO 
       if(!hasArticleInList(id)){mArticleList.add(new Article(id, img, title, content));} 
       result = RESULT_DATA_ADDED; 
      } 

     } 

    } catch (Exception e) { 
     Timber.e(e, "Error parsing JSON Object"); 
    } 
    return result; 
} 

предотвратить задачу асинхронной от работы по ориентации измените, у вас есть несколько параметров, либо вы можете проверить, является ли ваш ArrayList нулевым, чтобы он вызывался в представлении create (но только в первый раз), или вы можете создать логическое имя first и инициализировать его на false; , то после первой синхронизации вы можете переключить его на true и обернуть вызов вашему классу async в блоке if

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