سوال - اجرای getAppDatabase در یک Thread مجزا چگونه؟

پرسیده شده
فعالیت 1418 روز پیش
دیده شده 1116 بار
0

سلام و احترام

سوالی که دارم این هست که ما در پروژه لیست وظایف اومدیم (قسمت لایبرری Room)و کلاسی به نام AppDatabase ساختیم 

اما سوال من اینجاست که چگونه میتوانیم متد getAppDatabase رو در یک Thread جداگانه اوکی کنیم که از متد زیر استفاده نکنیم 

.allowMainThreadQueries()

من چنین کاری کردم(کد زیر) ولی اپم فورس کلوز داد(حتی عمل return هم با Handler به UiThread سپردم)

public abstract class AppDatabase extends RoomDatabase {
    private static AppDatabase appDatabase;

    public static AppDatabase getAppDatabase(final Context context) {
        //LazeInitilization
        if(appDatabase ==null){
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    appDatabase = Room.databaseBuilder(context.getApplicationContext() , AppDatabase.class , "db_app")
                                .build();

                }
            });
            thread.start();
        }
        return appDatabase;
    }
    public abstract TaskDao getTaskDao();
}

 

فایل پیوست

پوریا شفیعی
پوریا شفیعی

28 خرداد 99

1
حذف شده
package project.framework.database.core

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import androidx.sqlite.db.SupportSQLiteDatabase
import project.framework.database.dao.BankDao
import project.framework.database.dao.CategoryDao
import project.framework.database.dao.TransactionDao
import project.framework.database.daotransaction_category.TransactionCategoryDao
import project.framework.database.entity.Bank
import project.framework.database.entity.Category
import project.framework.database.entity.Transaction
import project.framework.database.entity.TransactionCategory
import project.framework.database.typeconveerter.DataConverter
import java.util.concurrent.Executors


@Database(
    entities = [Transaction::class, Category::class, Bank::class, TransactionCategory::class],
    version = 1
)
@TypeConverters(DataConverter::class)
abstract class PayabankRoomDatabase : RoomDatabase() {

    abstract fun transactionDao(): TransactionDao

    abstract fun categoryDao(): CategoryDao

    abstract fun bankDao(): BankDao

    abstract fun transactionCategoryDao(): TransactionCategoryDao

    companion object {

        @Volatile
        private var instance: PayabankRoomDatabase? = null
        private const val DATABASE_NAME = "payabank.db"

        private val LOCK = Object()


        fun getInstance(context: Context): PayabankRoomDatabase {
            if (instance == null) {
                synchronized(LOCK) {
                    if (instance == null) {
                        instance = Room.databaseBuilder(
                            context.applicationContext,
                            PayabankRoomDatabase::class.java, DATABASE_NAME
                        )
                            .fallbackToDestructiveMigration()
                            .allowMainThreadQueries()
                            .addCallback(object : RoomDatabase.Callback() {
                                override fun onCreate(db: SupportSQLiteDatabase) {
                                    super.onCreate(db)
                                    Executors.newSingleThreadExecutor().execute {
                                        getInstance(context).categoryDao()
                                            .insertAll(PopulateDatabase.populateCategoryData())
                                        getInstance(context).bankDao().insertAll(PopulateDatabase.populateBankData())
                                        getInstance(context).transactionDao()
                                            .insertAll(PopulateDatabase.populateTransactionData())
                                        getInstance(context).transactionCategoryDao()
                                            .insertAll(PopulateDatabase.populateTransactionCategoryData())
                                    }
                                }
                            })
                            .setJournalMode(JournalMode.TRUNCATE)
                            .build()

                    }
                }
            }

            return instance as PayabankRoomDatabase
        }
    }
}

 

فایل پیوست

وحید گروسی

توسط

وحید گروسی

29 خرداد 99

حذف شده
یا از executer ها استفاده کنی این مثال رو یه نگاه کن بخشی از پروژه خودمه
وحید گروسی

29 خرداد 99

حذف شده
کلا درباره volatile و synchronized یه مطالعه کن بد نیست
وحید گروسی

29 خرداد 99

حذف شده
وحید جان ممنونم آیا این کار با RxJava امکان پذیر نیست؟ یا اون کلا ی مقوله جداست؟
پوریا شفیعی

29 خرداد 99

حذف شده
چرا منتهی بذار برسی به اونجا :)
وحید گروسی

29 خرداد 99

حذف شده
بسیار عالی وحید واسه کلیه امور برنامه مالتی ترد ، آیا RxJava جوابه ؟
پوریا شفیعی

29 خرداد 99

1
حذف شده

سلام پوریا جان باید از synchronized استفاده کنی درباره اش سرچ کن

فایل پیوست

وحید گروسی

توسط

وحید گروسی

29 خرداد 99