【问题标题】:Trying to use a Loader with AsyncTask. (Android)尝试将 Loader 与 AsyncTask 一起使用。 (安卓)
【发布时间】:2013-11-29 07:35:39
【问题描述】:

我正在尝试将 Loader 与 AsyncTask 一起使用,但是在 DoinBackground 方法中执行 Loader 的调用给我一个错误:LoaderManager 类型中的方法 initLoader(int, Bundle, LoaderManager.LoaderCallbacks) 不适用于参数(int、null、LoaderClass.MagicCall)

这是我的代码:

private class MagicCall extends AsyncTask<Void, Void, String> {

        ProgressDialog Asycdialog = new ProgressDialog(LoaderClass.this);
        @Override
        protected void onPreExecute() {

            Asycdialog.setMessage("Working");
            Asycdialog.show();
            super.onPreExecute();
        }

        protected String doInBackground(Void... args) {
            getLoaderManager().initLoader(0, null, this);

            String Z = Integer.toString(insertNameBD());
            return Z;
        }

        @Override
        protected void onPostExecute(String result) {
            //hide the dialog
            Asycdialog.dismiss();
            t3.setText(result); 
            super.onPostExecute(result);
        }
    }

【问题讨论】:

    标签: android android-asynctask android-loader


    【解决方案1】:

    你应该这样做

    class FooLoader extends AsyncTaskLoader {
     public FooLoader(Context context, Bundle args) {
      super(context);
      // do some initializations here
    }
    public String loadInBackground() {
      String result = "";
      // ...
      // do long running tasks here
      // ...
      return result;
    }
    }
    
    class FooLoaderClient implements LoaderManager.LoaderCallbacks {
      Activity context;
      // to be used for support library:
      // FragmentActivity context2;
      public Loader onCreateLoader(int id, Bundle args) {
         // init loader depending on id
        return new FooLoader(context, args);
     }
       public void onLoadFinished(Loader loader, String data) {
         // ...
         // update UI here
         //
      }
      public void onLoaderReset(Loader loader) {
         // ...
      }
      public void useLoader() {
         Bundle args = new Bundle();
        // ...
        // fill in args
      // ...
      Loader loader = 
         context.getLoaderManager().initLoader(0, args, this);
      // with support library: 
      // Loader loader = 
      //    context2.getSupportLoaderManager().initLoader(0, args, this);
      // call forceLoad() to start processing
      loader.forceLoad();
      }
     } 
    

    【讨论】:

    • 以上是子类吗?
    • LoaderManager 也报错,你有这方面的工作示例吗?
    • 我做了异步任务,但我认为加载器和异步任务完成了相同的工作,那么为什么你在一个操作中使用相同的工作。
    • 因为我无法理解 AsyncTaskLoader。
    【解决方案2】:

    您不应该在 AsyncTask 中使用 Loader!上面的答案是正确的,因为有一个 AsynTaskLoader 扩展了 loader 并提供了覆盖默认 Loader 属性的其他方法。

    您可以扩展 AsynTaskLoader 以提供您自己的实现并控制几个其他加载程序特定的功能。

    【讨论】:

      猜你喜欢
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 2016-03-25
      • 2013-12-25
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多