gpt4 book ai didi

android - 加载程序 onLoadFinished() 未调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:48 25 4
gpt4 key购买 nike

在首选项更改监听器中,我将其设置为使用 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;

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);
}

最佳答案

您没有正确实现和使用 Loader。不过,这是一件很难的事情。

从上面的代码中我看到您使用了 forceload() 方法,但是您还没有在您的 Loader 中实现它。如果您查看 Loaders 的源代码,此方法只会调用 onForceload() 事件,而该事件什么也不做。根据文档“子类必须实现它以处理对 forceLoad() 的请求。这将始终从进程的主线程调用。"

你应该阅读 this教程并从那里开始。

一般概念是,在您完成 AsyncTaskLoader 实现后,您的 fragment/Activity 将不会直接联系您的加载器。如果你这样做,你最终会遇到 Activity/fragment 生命周期的问题。 LoaderManager 负责使用这些方法

  1. 初始化加载器
  2. 重启加载器
  3. 销毁加载器

之后 Loader 将使用 LoaderManager.LoaderCallbacks 接口(interface)将任何结果报告回 fragment/Activity 。

关于android - 加载程序 onLoadFinished() 未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39543191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com