【问题标题】:App Getting Crash while Continuous open and close Activity between 2 activities应用程序在两个活动之间连续打开和关闭活动时崩溃
【发布时间】:2017-11-15 04:55:08
【问题描述】:

我的 Android 应用程序有多个活动,现在我的问题无法找到。

A Activity 有一个 recyclerView 它从本地数据库中获取数据,如果我点击它会打开 B Activity 的项目,同样的流程连续然后应用程序崩溃(比如打开 B Activity 回到 A Activity 并再次打开 B Activity-最多 5 到 6 次执行相同的操作然后应用程序崩溃)

崩溃消息与SQLite DATABASE 相关,但无法找到它发生的位置。请帮帮我...已经花更多时间在这上面...

注意:在两个活动中,在 Oncreate 上打开数据库并在 OnDestroy 上关闭数据库

错误信息

E/SQLiteQuery: exception: unable to open database file (code 14); query: SELECT DISTINCT * FROM parameters WHERE inspection_no LIKE '%TEST-123%'
E/InputChannel-JNI: Error 24 dup channel fd 1023.
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.testapp.testprocess, PID: 13078
                  java.lang.RuntimeException: Could not read input channel file descriptors from parcel.
                      at android.view.InputChannel.nativeReadFromParcel(Native Method)
                      at android.view.InputChannel.readFromParcel(InputChannel.java:148)
                      at android.view.IWindowSession$Stub$Proxy.addToDisplay(IWindowSession.java:841)
                      at android.view.ViewRootImpl.setView(ViewRootImpl.java:640)
                      at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)
                      at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:94)
                      at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3518)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2733)
                      at android.app.ActivityThread.-wrap12(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6121)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

【问题讨论】:

  • 我认为你完成任务后忘记关闭数据库对象。尝试关闭它..
  • @AdarshAshok,不,在这两个活动中在 Oncreate 上打开数据库并在 OnDestroy 上关闭数据库
  • 请在完成任务后关闭数据库...它可能会解决您的问题
  • 在 OnPause() 上关闭 dp 连接

标签: android database sqlite android-activity android-recyclerview


【解决方案1】:

每当我们访问或更新数据库时,我们都应该在执行操作后打开和关闭数据库。看看吧。

DataBaseHelper db = new DataBaseHelper(this);
db.open();
Cursor cursor = db.getAllItems(); 
maxCount = cursor.getCount(); 
Random gen = new Random();
row = gen.nextInt(maxCount); 
 if (cursor.moveToPosition(row)) {
    String myString = cursor.getString(1);
}
cursor.close();
db.close(); 

这里是getAllItems(),它将返回项目。

public Cursor getAllItems() 
{
return db.query(DATABASE_TABLE, new String[] {
        KEY_ROWID, 
        KEY_NAME
        }, 
        null, 
        null, 
        null, 
        null, 
        null);
}

所以在你的情况下,当你点击列表项时,你必须小心地打开/关闭数据库。

编码愉快!!

【讨论】:

    【解决方案2】:

    尝试使用 Singleton 模式并使用 db=DatabaseHelper.getInstance(context) 访问。它保证在整个应用程序生命周期中只存在一个数据库助手。

     public class DatabaseHelper extends SQLiteOpenHelper { 
    
     private static DatabaseHelper sInstance;
    
     private static final String DATABASE_NAME = "database_name";
     private static final String DATABASE_TABLE = "table_name";
     private static final int DATABASE_VERSION = 1;
    
     public static synchronized DatabaseHelper getInstance(Context context) {
    
      // Use the application context, which will ensure that you 
      // don't accidentally leak an Activity's context.
      if (sInstance == null) {
         sInstance = new DatabaseHelper(context.getApplicationContext());
      }
        return sInstance;
      }
    
      /**
        * Constructor should be private to prevent direct instantiation.
        * make call to static method "getInstance()" instead.
        */
         private DatabaseHelper(Context context) {
               super(context, DATABASE_NAME, null, DATABASE_VERSION);
         }
      }
    

    【讨论】:

      【解决方案3】:

      此错误通常发生在您忘记关闭数据库时。 尝试在事务结束后关闭游标和数据库。

      【讨论】:

        【解决方案4】:

        我通过以下步骤解决了这个问题。

        1. 我已经创建了单例数据库,所以它可以确保数据库对象只创建一次。
        2. 查询数据库后关闭游标对象。 (我错过了)
        3. 在活动的 onStop() 中关闭数据库。 (我读到 onDestroy() 不安全,肯定不会调用它)

        感谢大家及时的帮助:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多