Android - SQLite,Alarm Receiver和Async Task之间的合作

时间:2014-01-22 12:28:18

标签: android sqlite android-asynctask

我正在开发一个使用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插入过程中完美运行我的应用程序时会发生什么事情?是否有可能发生错误?

2 个答案:

答案 0 :(得分:0)

很难说基于您发布的代码。如果AsyncTask位于前景 Service / s内,则不会发生任何错误,否则AsyncTask可能被操作系统杀死(用户离开后) app)如果内存条件不佳则会出现。

答案 1 :(得分:0)

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

因为尝试在不同的线程中通过不同的连接对数据库进行写锁定会产生运行时异常。

要解决此问题,您可以实现单例数据库连接,默认情况下将对所有数据库的访问进行序列化。