2016-09-17 46 views
5

在首選項更改偵聽我已經把它用Loader下載新數據,然後填寫ListView,但是當我改變偏好僅被稱爲onCreateLoader()功能,onLoadFinished()回調函數仍然是多餘的,因此我的ListView沒有更新新的數據,我也碰巧有一個刷新按鈕,做同樣的事情,即下載數據增益和填充新數據的列表,但這裏onLoadFinished()因此通過更新列表來調用。裝載機onLoadFinished()不叫

刷新按鈕代碼

case R.id.menu_refresh : 
      ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
      boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); 
      if(isConnected) 
      { 
       getSupportLoaderManager().initLoader(0,null,this).forceLoad(); 
      } 
      else { 
       Toast.makeText(this,"No Internet",Toast.LENGTH_SHORT).show(); 
      } 
      break; 

的SharedPreference監聽器代碼:

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) { 
    ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); 
    if(isConnected) 
    { 
     //delfromold(); 
     getSupportLoaderManager().initLoader(0,null,this).forceLoad(); 
     Log.v("Prefrences Changed",s); 
    } 
} 

編輯

裝載機實現

public class Loade extends AsyncTaskLoader<ArrayList<CustomL>>{ 

Context mCon; 

public Loade(Context context) { 
    super(context); 
    mCon = context; 
} 

@Override 
public ArrayList<CustomL> loadInBackground() { 
    ArrayList<CustomL> maList = null; 
    try { 
     Log.v("Loader","Called"); 
     maList = GetList.makelist(mCon); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    return maList; 
} 
} 

裝載機:

public Loader<ArrayList<CustomL>> onCreateLoader(int id, Bundle args) { 
    return new Loade(this); 
} 

public void onLoadFinished(Loader<ArrayList<CustomL>> loader, ArrayList<CustomL> data) { 
    Log.v("Load","Finished"); 
    maklst(data); 
} 
+0

在Getlist類的makelist函數中,新數據被下載並保存到表中我可以證實,但是,它只是停在那裏onLoadFinished dosnt被調用,而用新數據更新列表的maklst函數永遠不會被調用,但是當我調用相同的loader從刷新onLoadFinished被調用 –

回答

0

您沒有正確實施和使用Loader。不過,這是一件很難的事情。

從上面的代碼中我看到您使用forceload()方法,但是您尚未在您的Loader中實現它。如果你檢查Loaders的源代碼,這個方法只會調用onForceload()事件,它不執行任何操作。據文檔「子類必須實現這個照顧的請求,以forceLoad(),這將始終從進程的主線程調用。 」

你應該閱讀this教程,並從那裏開始。

一般概念是,在完成AsyncTaskLoader實施後,您的碎片/活動將不會直接與您的Loader聯繫。如果你這樣做,你最終會遇到活動/片段生命週期的問題。該LoaderManager使用這些方法

  1. initLoader
  2. restartLoader
  3. destroyLoader

之後的Loader將使用LoaderManager.LoaderCallbacks接口報告任何結果反饋給片段/活動負責人認爲。