2012-05-05 12 views
0

データベース操作をスプレッドスレッドで行いたいのでまずThreadLooperを作成します。これはRunnablesをポストするのに使用され、DB操作を開始します。私はこれを同期する必要があります

それは次のようになります。

import android.os.Handler; 
import android.os.Handler.Callback; 
import android.os.HandlerThread; 
import android.os.Message; 

/** 
* @author 
* @version 1.0 This class is used as ThreadLooper to make the database 
*   operation CRUD , this looper is singlton across the app 
* 
*/ 
public class DBThreadLooper extends HandlerThread { 
    public Handler mHandler; 

    private DBThreadLooper(String name) { 
     super(name); 

    } 

    private static DBThreadLooper mInstance; 

    public static DBThreadLooper newInstance() { 

     if (mInstance == null) { 
      mInstance = new DBThreadLooper("DATA BASE THREAD LOOPER "); 
      mInstance.start(); 
     } 
     return mInstance; 
    } 

    @Override 
    public synchronized void start() { 
     super.start(); 
     waitUntilReady(); 
    } 

    private void waitUntilReady() { 
     mHandler = new Handler(getLooper(), new Callback() { 

      public boolean handleMessage(Message msg) { 

       return true; 
      } 
     }); 
    } 

    @Override 
    protected Object clone() throws CloneNotSupportedException { 
     throw new CloneNotSupportedException(); 
    } 

} 

今、私はDB操作

private void handleFavButton() { 
     int index = viewPager.getCurrentItem(); 
     Cursor c = mAdapter.getAdapterCursor(); 
     c.moveToPosition(index); 
     final String quote_id = c.getString(c.getColumnIndex(QuoteTableMetaData._ID)); 

     final int is_fav = c.getInt(c.getColumnIndex(QuoteTableMetaData.C_IS_FAVORITE)); 


     if(is_fav == 0){ 
      DBThreadLooper looper = DBThreadLooper.newInstance(); 
      looper.mHandler.post(new Runnable() { 

       public void run() { 
        //1. make it 1 
        QuoteTableMetaData qTable = QuoteTableMetaData 
          .getInstance(); 
        ContentValues values = new ContentValues(); 
        values.put(QuoteTableMetaData.C_IS_FAVORITE, new Integer(1)); 
        qTable.update(DBUtils.getDBHelper(getApplicationContext()) 
          .getWritableDatabase(), values, 
          QuoteTableMetaData._ID + "= ?", 
          new String[] { quote_id }); 
        //2. insert a new record in Fav Table with the id 
        FavouriteQuoteTable fTable = FavouriteQuoteTable 
          .getInstance(); 
        values.clear(); 
        values.put(FavouriteQuoteTable.C_QUOTE_ID, quote_id); 
        fTable.insert(DBUtils.getDBHelper(getApplicationContext()) 
          .getWritableDatabase(), null, values); 
       } 
      }); 
     } 
     else{ 
      DBThreadLooper looper = DBThreadLooper.newInstance(); 
      looper.mHandler.post(new Runnable() { 

       public void run() { 
        //1.make it 0 
        QuoteTableMetaData qTable = QuoteTableMetaData 
          .getInstance(); 
        ContentValues values = new ContentValues(); 
        values.put(QuoteTableMetaData.C_IS_FAVORITE, new Integer(0)); 
        qTable.update(DBUtils.getDBHelper(getApplicationContext()) 
          .getWritableDatabase(), values, 
          QuoteTableMetaData._ID + "=?", 
          new String[] { quote_id }); 
        // 2. delete record with id from fav Table 
        FavouriteQuoteTable fTable = FavouriteQuoteTable 
          .getInstance(); 
        fTable.delete(DBUtils.getDBHelper(getApplicationContext()) 
          .getWritableDatabase(), 
          FavouriteQuoteTable.C_QUOTE_ID + "=?", 
          new String[] { quote_id }); 
       } 
      }); 

     } 

を行います。このメソッドを持っている私のように私は、メソッドvolatilequote_idis_favを作成する必要がありますかメソッドが同期の問題に陥ることはありません。

答えて

1

mutlithreadの問題はありません。ローカル変数です(さらに最終的です)。これは、メソッドhandleFavButtonへのすべての呼び出しがそれらのインスタンスを個別に持ち、変数にアクセスする異なる呼び出しが干渉しないことを意味します。

+0

ありがとう – user4o01

関連する問題