Nik*_*oni 5 android loader sharedpreferences
在偏好更改侦听器中我已将其设置为使用Loader然后填充来下载新数据ListView,但是onCreateLoader()当我更改首选项时仅调用该函数,onLoadFinished()回调函数仍然ListView未被调用,因此我没有更新新数据,我也碰巧有刷新按钮执行相同的操作,即下载数据增益并使用新数据填充列表,但此处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;
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
装载机实施
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;
}
}
Run Code Online (Sandbox Code Playgroud)
装载机:
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);
}
Run Code Online (Sandbox Code Playgroud)
小智 0
您没有Loader正确实施和使用。但这是一件很难做到的事情。
从上面的代码中我看到您使用了该forceload()方法,但您尚未在Loader. 如果您检查 Loaders 的源代码,则此方法仅调用onForceload()不执行任何操作的事件。根据文档,“子类必须实现它来处理对 的请求forceLoad()。这将始终从进程的主线程中调用。”
您应该阅读本教程并从那里开始。
一般概念是,完成AsyncTaskLoader实现后,您的片段/活动将不会直接联系您的加载器。如果你这样做,你最终会遇到活动/片段生命周期的问题。LoaderManager 负责使用这些方法
initLoaderrestartLoaderdestroyLoader 然后,Loader将使用该LoaderManager.LoaderCallbacks接口将任何结果报告回片段/活动。
| 归档时间: |
|
| 查看次数: |
742 次 |
| 最近记录: |