2017-02-22 94 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

我认为这与滚动的负载有关。几乎没有书签,Android认为我处于行尾,然后再次加载。就像我猜测的那样。我想我已经解决了这个提交: https://github.com/magicleon94/Popular-Movies-Stage-2/commit/e79043738b9bf9f0dd2535733890b0fdc561c89c 我希望这可以帮助你,我真的很抱歉没有能够做更多 – magicleon