2012-05-05 118 views
0

我想让我的数据库操作在一个扩展线程中,所以首先我要制作一个ThreadLooper,它将用于发布Runnables,它们正在启动数据库操作。我需要同步这个

它看起来像这样:

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 }); 
       } 
      }); 

     } 

我需要做quote_idis_fav的方法volatile,让我方法不会遇到同步问题。

回答

1

它们没有多线程问题:它们是局部变量(最后)。这意味着对方法handleFavButton的每个调用都将有它们的单独实例,并且访问这些变量的不同调用不会产生干扰。

+0

非常感谢你 – user4o01