【问题标题】:Android - cooperation between SQLite, Alarm Receiver and Async TaskAndroid - SQLite、Alarm Receiver 和 Async Task 之间的合作
【发布时间】:2014-01-22 12:28:18
【问题描述】:

我正在开发一个使用 SQLite 连接的简单 Android 应用程序。当我运行它时,它会执行一个异步任务,该任务从 SQLite 读取所有记录并将它们作为列表显示在 App 中:

public class ReadData extends AsyncTask< Void, Void, String >
{
    @Override
    protected String doInBackground( Void... arg0 ) 
    {
        Database oDatabase = new Database( );
        SQLiteDatabase myDB = oDatabase.getWritableDatabase( );
        Cursor cursor = myDB.rawQuery( "SELECT * FROM `items` ORDER BY `id`", null );

        if( cursor != null )
        {
            while( cursor.moveToNext( ) )
            {
                MainActivity.items.add( new DataItem( Database.getIntegerIndex( cursor, "test a" ), Database.getIntegerIndex( cursor, "test b" ), Database.getIntegerIndex( cursor, "test c" ), Database.getIntegerIndex( cursor, "test d" ) ) );
            }
        }
    }
}

如果我单击“添加”按钮,警报接收器会在 30 秒后运行另一个异步任务,并且它会执行少量数据库插入:

public class InsertData extends AsyncTask< Void, Void, String >
{
    @Override
    protected String doInBackground( Void... arg0 ) 
    {
        Database oDatabase = new Database( );
        SQLiteDatabase myDB = oDatabase.getWritableDatabase( );
        ContentValues newTodoValues = new ContentValues( );

        int iTestA = new Random( ).nextInt( 100 );
        int iTestB = new Random( ).nextInt( 100 );
        int iTestC = new Random( ).nextInt( 100 );
        int iTestD = new Random( ).nextInt( 100 );

        newTodoValues.put( "test a", iTestA );
        newTodoValues.put( "test b", iTestB );
        newTodoValues.put( "test c", iTestC );
        newTodoValues.put( "test d", iTestD );

        myDB.insert( "items", null, newTodoValues );

        boolean bIsRunning = false;
        String[ ] tokens = Tools.getBase( ).getApplicationContext( ).getPackageName( ).split( "\\." );

        if( tokens.length >= 3 && tokens[ 0 ].equals( "kibbo" ) && tokens[ 1 ].equals( "soft" ) && tokens[ 2 ].equals( "app" ) )
            bIsRunning = Tools.getBase( ).getApplicationContext( ).getPackageName( ).equalsIgnoreCase( ( ( ActivityManager )Tools.getBase( ).getApplicationContext( ).getSystemService( Context.ACTIVITY_SERVICE ) ).getRunningTasks( 1 ).get( 0 ).topActivity.getPackageName( ) );

        if( bIsRunning && Tools.base.getEngine( ) != null )
            MainActivity.items.add( new DataItem( newTodoValues.getAsInteger( "test a" ), newTodoValues.getAsInteger( "test b" ), newTodoValues.getAsInteger( "test c" ), newTodoValues.getAsInteger( "test d" ) ) );
    }
}

当我点击“添加”按钮并离开应用程序时,警报接收器仍将在 30 秒后执行异步任务和 SQL 插入。安全吗?我的意思是当我在 Async Task 的 SQL 插入过程中完美运行我的应用程序时会发生什么事情吗?会不会有什么问题发生?

【问题讨论】:

    标签: android sqlite android-asynctask


    【解决方案1】:

    根据您发布的代码很难说。如果AsyncTasks 在 foregrounded Service/s 内,则不会发生任何错误,但如果内存不足,AsyncTask 可能会被操作系统杀死(在用户离开应用程序后)条件发生。

    【讨论】:

      【解决方案2】:

      是的,它可以保存,只要没有其他线程尝试使用不同的连接写入同一个数据库。

      因为试图通过不同线程中的不同连接为数据库获取写锁会产生运行时异常。

      为了解决这个问题,你可以实现一个单例数据库连接,默认情况下所有对数据库的访问都将序列化。

      【讨论】:

        猜你喜欢
        • 2019-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-06
        • 1970-01-01
        • 1970-01-01
        • 2018-03-08
        相关资源
        最近更新 更多