无法恢复活动

我是新手,并试图让我的ListView刷新SQLite数据库更新后。 修改我的onResume()方法后,我没有收到编译错误。 我正在使用SimpleCursorAdapter重新查询,但它不工作。 收到的错误来自logcat,并在下面。 请指教…例子最好的帮助。

logcat的:

  02-19 21:31:49.933: E/AndroidRuntime(714): java.lang.RuntimeException: Unable to resume activity {com.loginplus.home/com.loginplus.home.LoginList}: java.lang.NullPointerException 02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2444) 02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2472) 02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1986) 02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.ActivityThread.access$600(ActivityThread.java:123) 02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 02-19 21:31:49.933: E/AndroidRuntime(714): at android.os.Handler.dispatchMessage(Handler.java:99) 02-19 21:31:49.933: E/AndroidRuntime(714): at android.os.Looper.loop(Looper.java:137) 02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.ActivityThread.main(ActivityThread.java:4424) 02-19 21:31:49.933: E/AndroidRuntime(714): at java.lang.reflect.Method.invokeNative(Native Method) 02-19 21:31:49.933: E/AndroidRuntime(714): at java.lang.reflect.Method.invoke(Method.java:511) 02-19 21:31:49.933: E/AndroidRuntime(714): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 02-19 21:31:49.933: E/AndroidRuntime(714): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 02-19 21:31:49.933: E/AndroidRuntime(714): at dalvik.system.NativeStart.main(Native Method) 02-19 21:31:49.933: E/AndroidRuntime(714): Caused by: java.lang.NullPointerException 02-19 21:31:49.933: E/AndroidRuntime(714): at com.loginplus.home.LoginList.onResume(LoginList.java:101) 02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1154) 02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.Activity.performResume(Activity.java:4539) 02-19 21:31:49.933: E/AndroidRuntime(714): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2434) 

活动:

  public class LoginList extends Activity implements OnClickListener, OnItemClickListener { private ListView loginList; private Button webLogin; private ListAdapter loginListAdapter; private ArrayList<LoginDetails> loginArrayList; List<String> arrayList = new ArrayList<String>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); arrayList = populateList(); loginListAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList()); setContentView(R.layout.login_listview); loginList = (ListView) findViewById(R.id.loginlist); loginList.setOnItemClickListener(this); webLogin = (Button) findViewById(R.id.button3); webLogin.setOnClickListener(this); } @Override public void onClick (View v) { Intent webLoginIntent = new Intent (this, LoginPlusActivity.class); startActivity(webLoginIntent); } public List<String> populateList (){ List<String> webNameList = new ArrayList<String>(); dataStore openHelperClass = new dataStore (this); SQLiteDatabase sqliteDatabase = openHelperClass.getReadableDatabase(); Cursor cursor = sqliteDatabase.query(dataStore.TABLE_NAME_INFOTABLE, null, null, null, null, null, dataStore.COLUMN_NAME_SITE, null); startManagingCursor(cursor); while (cursor.moveToNext()){ String sName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_SITE)); String wUrl = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_ADDRESS)); String uName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_USERNAME)); String pWord = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_PASSWORD)); String lNotes = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_NOTES)); LoginDetails lpDetails = new LoginDetails(); lpDetails.setsName(sName); lpDetails.setwUrl(wUrl); lpDetails.setuName(uName); lpDetails.setpWord(pWord); lpDetails.setlNotes(lNotes); loginArrayList.add(lpDetails); webNameList.add(sName); } sqliteDatabase.close(); return webNameList; } @Override protected void onResume() { super.onResume(); loginArrayList.clear(); arrayList.clear(); arrayList = populateList(); dataStore refreshHelper = new dataStore (this); SQLiteDatabase sqliteDatabase = refreshHelper.getWritableDatabase(); Cursor cursor = sqliteDatabase.query(dataStore.TABLE_NAME_INFOTABLE, null, null, null, null, null, dataStore.COLUMN_NAME_SITE, null); String[]columns = new String[] { dataStore.COLUMN_NAME_SITE, dataStore.COLUMN_NAME_ADDRESS, dataStore.COLUMN_NAME_USERNAME, dataStore.COLUMN_NAME_PASSWORD, dataStore.COLUMN_NAME_NOTES }; int[] to = new int[]{R.id.rusName, R.id.ruwUrl, R.id.ruuName, R.id.rupWord, R.id.ruNotes}; SimpleCursorAdapter loginListAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, columns, to); loginListAdapter.notifyDataSetChanged(); } @Override public void onItemClick(AdapterView<?> arg0 , View arg1, int arg2, long arg3) { Toast.makeText(getApplicationContext(), "Selected ID :" + arg2, Toast.LENGTH_SHORT).show(); Intent updateDeleteLoginInfo = new Intent (this, UpdateDeleteLoginList.class); LoginDetails clickedObject = loginArrayList.get(arg2); Bundle loginBundle = new Bundle(); loginBundle.putString("clickedWebSite",clickedObject.getsName()); loginBundle.putString("clickedWebAddress",clickedObject.getwUrl()); loginBundle.putString("clickedUserName",clickedObject.getuName()); loginBundle.putString("clickedPassWord",clickedObject.getpWord()); loginBundle.putString("clickedNotes",clickedObject.getlNotes()); updateDeleteLoginInfo.putExtras(loginBundle); startActivityForResult(updateDeleteLoginInfo, 0); } } 

RennoDiniro EditResults:

logcat的:

  02-21 23:40:18.419: E/AndroidRuntime(705): FATAL EXCEPTION: main 02-21 23:40:18.419: E/AndroidRuntime(705): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.loginplus.home/com.loginplus.home.LoginList}: java.lang.NullPointerException 02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.ActivityThread.access$600(ActivityThread.java:123) 02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 02-21 23:40:18.419: E/AndroidRuntime(705): at android.os.Handler.dispatchMessage(Handler.java:99) 02-21 23:40:18.419: E/AndroidRuntime(705): at android.os.Looper.loop(Looper.java:137) 02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.ActivityThread.main(ActivityThread.java:4424) 02-21 23:40:18.419: E/AndroidRuntime(705): at java.lang.reflect.Method.invokeNative(Native Method) 02-21 23:40:18.419: E/AndroidRuntime(705): at java.lang.reflect.Method.invoke(Method.java:511) 02-21 23:40:18.419: E/AndroidRuntime(705): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 02-21 23:40:18.419: E/AndroidRuntime(705): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 02-21 23:40:18.419: E/AndroidRuntime(705): at dalvik.system.NativeStart.main(Native Method) 02-21 23:40:18.419: E/AndroidRuntime(705): Caused by: java.lang.NullPointerException 02-21 23:40:18.419: E/AndroidRuntime(705): at com.loginplus.home.LoginList.populateList(LoginList.java:88) 02-21 23:40:18.419: E/AndroidRuntime(705): at com.loginplus.home.LoginList.onCreate(LoginList.java:37) 02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.Activity.performCreate(Activity.java:4465) 02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 02-21 23:40:18.419: E/AndroidRuntime(705): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 

活动等级:

  public class LoginList extends Activity implements OnClickListener, OnItemClickListener { private ListView loginList; private Button webLogin; private ListAdapter loginListAdapter; private ArrayList<LoginDetails> loginArrayList; List<String> arrayList = new ArrayList<String>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); loginListAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList()); arrayList = populateList(); setContentView(R.layout.login_listview); loginList = (ListView) findViewById(R.id.loginlist); loginList.setOnItemClickListener(this); webLogin = (Button) findViewById(R.id.button3); webLogin.setOnClickListener(this); } @Override public void onClick (View v) { Intent webLoginIntent = new Intent (this, LoginPlusActivity.class); startActivity(webLoginIntent); } public List<String> populateList (){ List<String> webNameList = new ArrayList<String>(); dataStore openHelperClass = new dataStore (this); SQLiteDatabase sqliteDatabase = openHelperClass.getReadableDatabase(); Cursor cursor = sqliteDatabase.query(dataStore.TABLE_NAME_INFOTABLE, null, null, null, null, null, dataStore.COLUMN_NAME_SITE, null); startManagingCursor(cursor); while (cursor.moveToNext()){ String sName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_SITE)); String wUrl = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_ADDRESS)); String uName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_USERNAME)); String pWord = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_PASSWORD)); String lNotes = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_NOTES)); LoginDetails lpDetails = new LoginDetails(); lpDetails.setsName(sName); lpDetails.setwUrl(wUrl); lpDetails.setuName(uName); lpDetails.setpWord(pWord); lpDetails.setlNotes(lNotes); loginArrayList.add(lpDetails); webNameList.add(sName); } sqliteDatabase.close(); return webNameList; } @Override protected void onResume() { super.onResume(); try{ loginArrayList = new ArrayList<LoginDetails>(); arrayList = new ArrayList<String>(); loginArrayList.clear(); arrayList.clear(); arrayList = populateList(); dataStore refreshHelper = new dataStore (this); SQLiteDatabase sqliteDatabase = refreshHelper.getWritableDatabase(); Cursor cursor = sqliteDatabase.query(dataStore.TABLE_NAME_INFOTABLE, null, null, null, null, null, dataStore.COLUMN_NAME_SITE, null); String[]columns = new String[] { dataStore.COLUMN_NAME_SITE, dataStore.COLUMN_NAME_ADDRESS, dataStore.COLUMN_NAME_USERNAME, dataStore.COLUMN_NAME_PASSWORD, dataStore.COLUMN_NAME_NOTES }; int[] to = new int[]{R.id.rusName, R.id.ruwUrl, R.id.ruuName, R.id.rupWord, R.id.ruNotes}; SimpleCursorAdapter loginListAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, columns, to); loginListAdapter.notifyDataSetChanged(); }catch(Exception e) { e.printStackTrace(); } } @Override public void onItemClick(AdapterView<?> arg0 , View arg1, int arg2, long arg3) { Toast.makeText(getApplicationContext(), "Selected ID :" + arg2, Toast.LENGTH_SHORT).show(); Intent updateDeleteLoginInfo = new Intent (this, UpdateDeleteLoginList.class); LoginDetails clickedObject = loginArrayList.get(arg2); Bundle loginBundle = new Bundle(); loginBundle.putString("clickedWebSite",clickedObject.getsName()); loginBundle.putString("clickedWebAddress",clickedObject.getwUrl()); loginBundle.putString("clickedUserName",clickedObject.getuName()); loginBundle.putString("clickedPassWord",clickedObject.getpWord()); loginBundle.putString("clickedNotes",clickedObject.getlNotes()); updateDeleteLoginInfo.putExtras(loginBundle); startActivityForResult(updateDeleteLoginInfo, 0); } } 

Solutions Collecting From Web of "无法恢复活动"

使用指向所需数据的光标和布局信息创build适配器。

 SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, columns, to); 

在你的情况下,你使用R.layout.simple_list_item_1

columns将为nullParticular column data which you get from cursor

将会是android.R.id.text1


例如

  Cursor cursor = getContentResolver().query(People.CONTENT_URI, new String[]{People._ID, People.NAME, People.NUMBER}, null, null, null); startManagingCursor(cursor); // THE DESIRED COLUMNS TO BE BOUND String[] columns = new String[] { People.NAME, People.NUMBER }; // THE XML DEFINED VIEWS WHICH THE DATA WILL BE BOUND TO int[] to = new int[] { R.id.name_entry, R.id.number_entry }; SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this,R.layout.list_example_entry, cursor, columns, to); 

显然你不要初始化ArrayList。 但是..对于您的情况,请考虑使用加载程序 。 ApiDemos中有完整的例子(列在Loader页面的底部)。

注意 ,你永远不会实例化loginArrayList ,因此当你尝试在onResume()访问它时,它是空的,因此崩溃。 在访问它之前实例化。

更新22/02/2013:

loginArrayList ,你忘了实例化loginArrayList ,当应用程序首先运行。

在你的onCreate() ,把下面的代码放在super.OnCreate(...)

 loginArrayList = new ArrayList<LoginDetails>(); 

所以它看起来像:

 loginArrayList = new ArrayList<LoginDetails>(); loginListAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,populateList()); arrayList = populateList(); setContentView(R.layout.login_listview); //rest of your code... 

让您的应用程序运行的一个快速调整是以下,但请注意,为了解决这个问题,需要更深入地分析整个暂停和恢复过程中丢失的信息。

在你的onResume() ,做

 try{ // your code }catch(Exception e) { //Have the printStackTrace to the problems see what's going on without crashing. //e.printStackTrace(); } 

但是这并不能解决问题,

onResume() 。 请执行下列操作:

  • 首次获取数据时,将其存储到数据库中。
  • 在onResume()重新创build列表并使用存储在数据库中的数据进行更新。

所以开始你

 @Override protected void onResume() { super.onResume(); loginArrayList = new ArrayList<LoginDetails>(); arrayList = new ArrayList<String>(); arrayList = populateList(); // any other code you require to be done after the list is populated. } 

祝你好运。

看来游标是空的,一个快速的方法来解决这个问题,让你的应用程序运行是改变:

 SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor,null,null); mAdapter.notifyDataSetChanged(); 

 if (cursor != null) { SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor,null,null); mAdapter.notifyDataSetChanged(); } 

否则,看起来你的光标可能是空的,你可能会用错误的投影查询。

您需要在SimpleCursorAdapter构造函数中提供从列名到资源ID的映射 – 传递给它的参数from和null。

问题是托pipe的光标 –

 startManagingCursor(cursor); 

尝试自己维护游标,而不是使用已弃用的“活动托pipe”游标。

在pipe理游标后,我在2天前通过onResume调用来处理完全相同的问题。

你永远不会初始化loginArrayList (因此它是null )。