【问题标题】:Call LoaderManager from class which is not Activity从不是 Activity 的类调用 LoaderManager
【发布时间】:2017-02-19 06:25:21
【问题描述】:

我正在努力从电话中获取联系人,为此我使用了LoaderCallbacks<Cursor>,我创建了一个名称为FetchContacts 的新类并实现了loaderManager。现在我想在创建该类 loaderManager 的对象时自动初始化。
FetchContacts

  public class FetchContacts implements LoaderManager.LoaderCallbacks<Cursor> {
       private Context context;

     FetchContacts(Context ctx){
        context = ctx;
        getLoaderManager().initLoader(0, null, this); // Error: Undefined method
     }  
     // Reset of code like override methods.

MainActivity

     public class MainActivity extends AppCompatActivity {
        protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);
           FetchContacts fetchContacts = new FetchContacts(this);
       }
     }

我知道错误的原因是因为FetchContacts 不是从 Activity 类扩展而来的。是否需要从 Activity 类扩展它,或者是否有其他方法可以从 MainActivity 调用它?

【问题讨论】:

  • 您可以将LoaderManager 作为FetchContacts 构造函数中的参数传递,但我不确定您为什么要这样做。 stackoverflow.com/a/13433085
  • 因为我想在需要的时候获取联系人。如果我不能打电话给initLoader(),那么这个类就没用了。有没有其他方法可以做到这一点。我是安卓新手。传递loaderManager是个好办法?
  • 您不需要Loader 来获取通讯录。 Loaders 主要用于向 UI 组件传递内容更新、更改等,例如 Activity。只要您可以访问Context,您就可以随时自行查询联系人提供程序。 stackoverflow.com/q/12562151 要专门回答您的最后一个问题,不,使用 LoaderManager 这样的方式并不是真正的好方法。
  • 但我发现cursorLoader 不错Note: All the examples in this lesson use a CursorLoader to retrieve data from the Contacts Provider. A CursorLoader runs its query on a thread that's separate from the UI thread. This ensures that the query doesn't slow down UI response times and cause a poor user experience 这是来自android 开发者developer.android.com/training/contacts-provider/…
  • 是的,当我去搜索那个例子时,我想这就是你从那里得到的。正如我所说,Loaders 用于将结果传递给ActivityFragment。如果这些是您需要结果的唯一地方,那么就不需要单独的课程;只需在您需要的任何Activity/Fragment 中实施必要的Loader 设置。如果“我想在需要的时候获取联系人”,你的意思是你试图在其他地方使用那个Loader 或其结果,那么你会很糟糕。

标签: android android-loadermanager


【解决方案1】:

如@Mike 所说,将LoaderManager 作为参数传递。

获取联系人

  public class FetchContacts implements LoaderManager.LoaderCallbacks<Cursor> {
       private Context context;

     FetchContacts(Context ctx, LoaderManager loaderManager){
        context = ctx;
        loaderManager.initLoader(0, null, this); 
     }  
     // Reset of code like override methods.

MainActivity

     public class MainActivity extends AppCompatActivity {
        protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);
           FetchContacts fetchContacts = new FetchContacts(this, getLoaderManager());
       }
     }

【讨论】:

  • 注意 - 这应该谨慎使用,因为 LoaderManager 类包含对活动的引用。如果你不小心,这可能会导致内存泄漏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
相关资源
最近更新 更多