加载器onLoadFinished()未调用

时间:2016-09-17 05:32:01

标签: android sharedpreferences loader

在偏好更改侦听器中,我已将其设置为使用Loader下载新数据,然后填充ListView,但在更改首选项时仅调用onCreateLoader()函数,{ {1}}回调函数仍然未被调用,因此我的onLoadFinished()未更新新数据,我也碰巧有一个刷新按钮执行相同的操作,即下载数据增益并用新数据填充列表但在这里因此,通过更新列表来调用ListView

刷新按钮代码

onLoadFinished()

SharedPreference侦听器代码:

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;

修改

Loader Implementation

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

1 个答案:

答案 0 :(得分:0)

您没有正确实施和使用Loader。但是,这很难做到。

从上面的代码中我看到您使用forceload()方法,但您尚未在Loader中实现它。如果检查Loaders的源代码,则此方法只调用不执行任何操作的onForceload()事件。根据文档&#34;子类必须实现此操作以处理对forceLoad()的请求。这将始终从进程的主线程调用。 &#34;

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

一般概念是,在您完成AsyncTaskLoader实施后,您的片段/活动将不会直接与您的Loader联系。如果这样做,您将最终遇到活动/片段生命周期的问题。 LoaderManager负责使用这些方法

  1. initLoader
  2. restartLoader
  3. destroyLoader
  4. 之后,Loader将使用LoaderManager.LoaderCallbacks界面将任何结果报告回片段/活动。