当前位置: 首页 > 知识库问答 >
问题:

从onCreateLoader返回的对象不能是非静态内部成员类:DumbLoader

利俊迈
2023-03-14
        // Home Activity class
        public class HomeActivity extends FragmentActivity implements LoaderCallbacks<Cursor> {
                DotCursorAdapter mAdapter;
                private ListView lv;
                private  final int LOADER_ID = 1932;

         DatabaseHandler dbHelper = new DatabaseHandler(this);

         @Override
         protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
                setContentView(R.layout.home_activity);
             lv = (ListView) findViewById(R.id.lists);


             mAdapter = new DotCursorAdapter(this, null,0);
             lv.setAdapter(mAdapter);

             getSupportLoaderManager().initLoader(LOADER_ID, null, this);   
        }





         @Override
         public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
             return new DumbLoader(this);
         }
         @Override
         public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
             mAdapter.swapCursor(cursor);
         }
         @Override
         public void onLoaderReset(Loader<Cursor> cursorLoader) {
             mAdapter.swapCursor(null);
         }



        /**
         * DumbLoader sub class 
         */ 
         public class DumbLoader extends CursorLoader {
             private static final String TAG = "DumbLoader";
             public DumbLoader(Context context) {
                 super(context);
             }
             @Override
             public Cursor loadInBackground() {
                 Cursor c = dbHelper.fetchAllCountries();

                 return c;

             }
        }






        /**
         * DotCursor Adapter sub class
         */
        public final class DotCursorAdapter extends CursorAdapter {

             public DotCursorAdapter(Context context, Cursor cursor, int flags) {
                  super(context, cursor, 0);
              }



             @Override
             public void bindView(View view, Context context, Cursor cursor) {

                  // Find fields to populate in inflated template
                  TextView tvBody = (TextView) view.findViewById(R.id.header_text);

                  String body = cursor.getString(cursor.getColumnIndexOrThrow("fname"));
                  // Populate fields with extracted properties
                  tvBody.setText(body);


             }
             @Override
              public View newView(Context context, Cursor cursor, ViewGroup parent) {
                  return LayoutInflater.from(context).inflate(R.layout.list_cardview_activity, parent, false);
              }
            }
    }
public  Cursor fetchAllCountries() {
    SQLiteDatabase db = this.getReadableDatabase();

      Cursor mCursor = db.query(TABLE_LOGIN, new String[] {KEY_ID,KEY_FIRSTNAME},
        null, null, null, null, null);

      if (mCursor != null) {
       mCursor.moveToFirst();
      }
      return mCursor;
     }

下面也是我的日志猫详细信息

09-21 16:13:25.563:D/AbsListView(26541):Get MotionRecognitionManager 09-21 16:13:25.568:D/AndroidRuntime(26541):关闭VM 09-21 16:13:25.573:W/DalvikVM(26541):ThreadId=1:线程退出未捕获异常(组=0x411372A0)09-21 16:13:25.573:E/AndroidRuntime(26541):致命异常:main 09-21 16:13:25.573:E/AndroidRuntime(26541):java.lang.RuntimeException:无法启动活动Iswell/com.Alliswell.Alliswell.HomeActivity}:java.lang.IllegalArgumentException:从onCreateLoader返回的对象不能是非静态内部成员类:DumbLoader{418dc668 id=0}09-21 16:13:25.573:e/AndroidRuntime(26541):at Android.app.ActivityThread.PerformLaunchActivite(ActivityThread.2110)09-21 16:13:25.573:e/AndroidRuntime(26541):at Android.app.ActivityThread.2110 E/AndroidRuntime(26541):at android.app.activitythread.access$700(activitythread.java:140)09-21 16:13:25.573:E/AndroidRuntime(26541):at Android.app.ActivityThread$H.HandleMessage(ActivityThread.java:1237)09-21 16:13:25.573:E/AndroidRuntime(26541):at Android.os.handler.dispatchMessage(handler.java:99)09-21 16:13:25.573:E/AndroidRuntime(26541):at Android.os.looper.loop(looper.java:137)09-21 16:13:25.573:E/AndroidRuntime(26541):at-21 16:13:25.573:E/AndroidRuntime(26541):at java.lang.reflect.Method.invokenative(本机方法)09-21 16:13:25.573:E/AndroidRuntime(26541):at java.lang.reflect.Method.invoke.invokenative(本机方法)09-21 16:13:25.573:E/AndroidRuntime(26541):at java.lang.reflect.Method.invoke(Method.java:511)09-21 jygoteinit.main(zygoteinit.java:805)09-21 16:13:25.573:e/AndroidRuntime(26541):at dalvik.system.nativeStart.main(原生方法)09-21 16:13:25.573:e/AndroidRuntime(26541):by:java.lang.IllegalargUmentException:从onCreateLoader返回的对象不能是非静态内部成员类:DumbLoader{418dc668 id=0}09-21 16:13:25.573:e/AndroidRuntime(26541):at Android.support.v4.app.LoaderManagerImpl$LoaderInfo.start(LoaderManager.java:257)09-21 16:13:25.573:e/AndroidRuntime(26541):at Android.support.v4.app.LoaderManagerImpl.doStart(LoaderManager.java:714).v4.app.fragmentactivity.onstart(fragmentactivity.java:556)09-21 16:13:25.573:e/androidruntime(26541):at android.app.instrumentation.callactivityonstart(instrumentation.java:1178)09-21 16:13:25.573:e/androidruntime(26541):at android.app.activity.performstart(activity.java:5198)09-21 16:13:25.573:e/androidruntime(26541):at.573:E/AndroidRuntime(26541):...11多

我想我在我的代码中做了一些错误的事情,如果有人能帮我解决这个问题,我将不胜感激。谢谢你。

共有1个答案

卢英范
2023-03-14

您有两种方法来解决这个问题:

1.-创建dumbloader.java文件,并将其设置为:

public class DumbLoader extends CursorLoader {

     private DatabaseHandler mDBHelper;

     public DumbLoader(Context context, DatabaseHandler dbHelper) {
         super(context);
         mDBHelper = dbHelper;
     }

     @Override
     public Cursor loadInBackground() {
         return mDBHelper.fetchAllCountries();
     }
}

2.-对活动的DumbLoader嵌套类使用static修饰符,使其如下所示:

public class HomeActivity extends FragmentActivity implements LoaderCallbacks<Cursor> {

    //onCreate(), etc...

    //Make DumbLoader nested class STATIC
    public static class DumbLoader extends CursorLoader {

        private DatabaseHandler mDBHelper;

        public DumbLoader(Context context, DatabaseHandler dbHelper) {
            super(context);
            mDBHelper = dbHelper;
        }

        @Override
        public Cursor loadInBackground() {
            return mDBHelper.fetchAllCountries();
        }
}
 类似资料:
  • 问题内容: 我知道创建一个非静态内部类对象需要一个外部类对象,而创建的非静态内部类对象会自动具有对该外部类对象的隐藏引用。但是为什么非静态内部类不能具有静态成员呢?Java设计人员只需要禁止在内部类的静态方法内访问非静态外部类字段,这样做会更有意义,不是吗? 如果在内部类中具有静态成员没有意义,那么为什么内部类可以通过继承具有静态成员的类来继承静态成员? 我也读了这篇文章。如前所述: 内部类可以继

  • 问题内容: Java教程说,由于内部类与封闭类的实例相关联,所以它(内部类)本身不能定义任何静态成员。 对我来说很有趣,为什么内部类不能声明静态成员,例如某个字段,该内部类的实例可能会与同一内部类的其他实例共享这些成员?这仅仅是Java中必须被视为理所当然的事情的实现吗? 问题答案: 基本上只是一个任意决定。我们没有理由也 不可能 得到支持,但还算不上什么好的理由 来 支持它。只需在外部类中声明静

  • 这是有效代码: 但是在这里,我真的很想声明和 。但是为什么呢?

  • 我已经知道java中的内部类不能有静态成员,除非它们被宣布为最终的。但是,理论上不应该在局部类中声明静态成员吗? 例如。 我知道内部类的标准初始化是这样发生的: 但为什么不这样呢?? 当创建OuterClass实例时,它还包含innerClass的副本。因此,如果允许在innerClass中存在静态(只是静态的,但不是最终的)成员,那么应该(或可以)以这种方式访问它们 outer class in

  • 我正在装一个应用程序,它工作得很好。但当我使用 在OuterClass中,并通过

  • 这个问题相当复杂,我不知道以前是否有人问过,因为我不知道如何在搜索框中表达这个问题。 下面是代码: 静态成员将在更多静态方法中再次使用,但我需要首先将其时区设置为“UTC”。有没有方法调用<code>。setTimeZone(“UTC”)一劳永逸?或者我必须调用<code>。setTimeZone(“UTC”)在每个静态方法中?