user4o01
user4o01

Reputation: 2698

Do I need Synchronize this

I want to make my Database operation in a spread thread, so first I make a ThreadLooper, which will be used to post Runnables, that are starting DB operations.

It looks like this:

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

}

Now I have this method that will make a DB operation

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

        }

Do I need to make quote_id and is_favin the method volatile, so that my method will not run into synchronization problems.

Upvotes: 0

Views: 207

Answers (1)

Boris Strandjev
Boris Strandjev

Reputation: 46943

No mutlithread problem with them: they are local variables (furthermore final). This means that every call to the method handleFavButton will have separate instances of them and the different calls accessing the variables will not interfere.

Upvotes: 1

Related Questions