2017-02-22 21 views
0

Android Loadersに問題があります。
私はインターネットのデータから作成されたアクティビティを持っており、ローカルに保存してロードするためのブックマークオプションがあります。
私は項目を表示するrecyclerViewを実装しています。
ソート基準を変更すると、adapterがクリアされ、新しいデータが再投入され、ブックマーク済みアイテムを表示することを選択すると、ローカルクエリがContentProviderに開始されます。
adapterに同じアイテムを複数コピーしているので、ブックマークしたデータに問題があります。
私はいくつかのロギングを行っていますが、ローダーはローカルにロードするとき(複数回同じアイテムを追加するとき)に複数回呼び出されますが、理由はわかりません。
これは、アクティビティに戻ったときにも発生しますが、ブックマークの設定でアプリを起動しても発生しないことに注意してください。
ブックマークから開始してブックマークを選択して戻ると、複数のコールも終了します。
誰も助けてくれますか?ここでは、コードです:MainActivity
この方法は私のローダコードonCreateonStartLoadingが複数回呼び出される

private void loadPosters() { 
    Log.d(TAG,"Loading posters"); 
    if (mPagesLoaded < MAX_PAGES) { 
     Bundle args = new Bundle(); 
     args.putInt("page",mPagesLoaded+1); 
     getSupportLoaderManager().restartLoader(LOADER_ID,args,this); 
    } 
} 

の最後に呼び出されます:

public Loader<ArrayList<Movie>> onCreateLoader(int id, final Bundle args) { 
    return new AsyncTaskLoader<ArrayList<Movie>>(this) { 
     ArrayList<Movie> mData; 

     @Override 
     protected void onStartLoading() { 
      Log.d(TAG,"Start Loading"); 
      super.onStartLoading(); 
      if (mData!=null){ 
       deliverResult(mData); 
      }else{ 
       if (mPagesLoaded == 0) { 
        mProgressBar.setVisibility(View.VISIBLE); 
       } 
       mErrorTextView.setVisibility(View.INVISIBLE); 
       forceLoad(); 
      } 
     } 

     @Override 
     public ArrayList<Movie> loadInBackground() { 
      Log.d(TAG,"Load in background"); 
      if (args.size() == 0) { 
       return null; 
      } 
      int page = args.getInt("page"); 
      NetworkUtils networker = new NetworkUtils(getApplicationContext()); 
      String criterion = getSharedPreferences(getString(R.string.movie_preferences), Context.MODE_PRIVATE).getString("sorting", "popular"); 
      if (!(criterion.equals(getString(R.string.pref_bookmarked)))) { 
       URL request = networker.buildMoviesUrl(page, criterion); 
       try { 
        String JSONResponse = networker.getResponseFromHttpUrl(request); 
        ArrayList<Movie> res = fetchMoviesFromJson(JSONResponse); 
        mPagesLoaded++; 
        return res; 

       } catch (IOException | JSONException e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
      else{ 
       Log.d(TAG,"Local Loading"); 
       Cursor cursor = getContentResolver().query(MovieContract.MovieEntry.CONTENT_URI,null,null,null,null); 
       if (cursor!=null){ 
        Log.d(TAG,"Cursor is not null"); 
        ArrayList<Movie> res = fetchMoviesFromCursor(cursor); 
        cursor.close(); 
        return res; 
       } 
       return null; 
      } 

     } 

     @Override 
     public void deliverResult(ArrayList<Movie> data) { 
      mData = data; 
      mProgressBar.setVisibility(View.INVISIBLE); 
      super.deliverResult(data); 
     } 
    }; 
} 

マイonLoadFinishedコールバック:

@Override 
public void onLoadFinished(Loader<ArrayList<Movie>> loader, ArrayList<Movie> movies) { 
    Log.d(TAG,"Load finished"); 
    mProgressBar.setVisibility(View.INVISIBLE); 
    if (movies != null) { 
     mPostersAdapter.addMovies(movies); 
     Log.d(TAG,mPostersAdapter.getItemCount() + " items loaded"); 
     showPosters(); 
    } else { 
     showErrorMessage(); 
    } 
} 

そして、私のSharedPreferencesコード:

private void initSharedPreferences() { 
    mSharedPrefs = getApplicationContext().getSharedPreferences("movie_preferences", MODE_PRIVATE); 
    mOnSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { 
     @Override 
     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
      Log.d(TAG, "Shared preferences for " + key + "changed. Pref: " + sharedPreferences.getString(key, null)); 
      mPagesLoaded = 0; 
      mPostersAdapter.clear(); 
      loadPosters(); 
     } 
    }; 
    mSharedPrefs.registerOnSharedPreferenceChangeListener(mOnSharedPreferenceChangeListener); 

} 
+0

問題が見つかりましたか? – Audi

+0

その時、私は問題を解決することができましたが、今は私がしたことを覚えていません。私が解決策を投稿するのを忘れたのは残念ですが、私は本当にこのことについて申し訳ありません。 – magicleon

答えて

1

これを解決するには、ローダーマネージャーにdestoryLoader()を呼び出す必要がありました。これが正しいのかどうかわからない。

+0

私はそれがスクロールの負荷と関係していたと思います。ブックマークはほとんどありません。アンドロイドは私が行の最後にいると思ってから再び読み込みました。私はそれが私が推測するような何か。私はこの中にコミットすることを修正したとします https://github.com/magicleon94/Popular-Movies-Stage-2/commit/e79043738b9bf9f0dd2535733890b0fdc561c89c私はされていないため、本当に申し訳ありませんが、これはあなたを助けることを願って より多くのことができる – magicleon

関連する問題