New*_*BIe 4 android loader android-asynctask
我试图在我的android项目中实现Cursor Loader和Custom Cursor Adapter数据库(Sqlite本地数据库).我实际上想借助Cursor Loader和Adapter`将我的listview与本地数据库中的数据异步提供.下面是我的类,子类和方法
// 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
下面还有我的数据库处理程序方法,它从数据库中获取数据.
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;
}
Run Code Online (Sandbox Code Playgroud)
问题 在上面执行此代码时,会从日志cat中发出消息错误并将应用程序包含在内.
主要错误
从onCreateLoader返回的对象不能是非静态内部成员类
下面也是我的日志猫详情
09-21 16:13:25.563:D/AbsListView(26541):获取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):致命异常:主09-21 16:13:25.573:E/AndroidRuntime( 26541):java.lang.RuntimeException:无法启动活动ComponentInfo {com.alliswell.alliswell/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.performLaunchActivity(ActivityThread.java:2110)09-21 16:13:25.573:E/ AndroidRuntime(26541):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)09-21 16:13:25.573:E/AndroidRuntime(26541):在android.app.ActivityThread.access $ 700(ActivityThread.java:140)09-21 16:13:25.573:E/AndroidRuntime(26541):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1237)09-21 16:13:25.573:E/AndroidRuntime(26541):在android.os.Handler.dispatchMessage(Handler. java:99)09-21 16:13:25.573:E/AndroidRuntime(26541):在android.os.Looper.loop(Looper.java:137)09-21 16:13:25.573:E/AndroidRuntime(26541) :在android.app.ActivityThread.main(ActivityThread.java:4921)09-21 16:13:25.573:E/AndroidRuntime(26541):at java.lang.reflect.Method.invokeNative(Native Method)09-21 16 :13:25.573:E/AndroidRuntime(26541):at java.lang.reflect.Method.invoke(Method.java:511)09-21 16:13:25.573:E/AndroidRuntime(26541):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1038)09-21 16:13:25.573:E/AndroidRuntime(26541):at com.android.internal.os.ZygoteInit.main( ZygoteInit.java:805)09-21 16:13:25.573:E/AndroidRuntime(26541):at dalvik.system.NativeStart.main(Native Method)09-21 16:13:25.573:E/AndroidRuntime(26541):引起:java.lang.IllegalArgumentException:从onCreateLoader返回的对象不能是非静态内部成员类:DumbLoader {418dc668 id = 0} 09-21 16:13:25.573:E/AndroidRuntime(26541):在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)09-21 16:13:25.573:E/AndroidRuntime(26541):在android.support.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):在android.app.Activity.performStart(Activity.java:5198)09-21 16:13:25.573:E/AndroidRuntime(26541):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java) :2083)09-21 16:13:25.573:E/AndroidRuntime(26541):... 11更多performLaunchActivity(ActivityThread.java:2083)09-21 16:13:25.573:E/AndroidRuntime(26541):... 11更多performLaunchActivity(ActivityThread.java:2083)09-21 16:13:25.573:E/AndroidRuntime(26541):... 11更多
我认为我在我的代码中做错了什么,如果有人能帮我解决这个问题,我将不胜感激.谢谢.
你有2种方法来解决这个问题:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
2.- static为Activity的DumbLoader嵌套类使用修饰符,使其如下所示:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2646 次 |
| 最近记录: |