دوره زبان تخصصی برای برنامه‌نویسان (هدیه ویژه ثبت‌نام در دوره‌های متخصص) (فرصت محدود ⏰)
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ احمدرضا عبداللهی
multi threading
محسن موحد حل شده توسط محسن موحد

وقت بخیر

اگر اپی مثل todo list داشته باشیم و بخوایم مثلا متد insert در thread دیگر انجام بشه چطور میتونیم این کار رو انجام بدیم؟

چون در مثال این جلسه فقط برای گرفتن لیست دانشجو‌ها از live data استفاده شد که این کار رو در thread دیگر انجام میده و برای متدی مثل insert از return type void استفاده شد و زمانی که response در thread دیگر با استفاده از rxjava برگشت در همان thread عمل insert انجام شد

اما اگر سناریو متفاوت باشه و ریکوئست به سرور نداشته باشیم چطور میتونیم این متد‌ها رو هم در thread دیگر انجام دهیم؟

سلام،

بخشی از سورس کدو قرار بدید تا ببینم.

محسن موحد ۰۵ آذر ۱۴۰۳، ۲۲:۱۹

در این کد اگر بخوایم متدها در thread دیگر انجام بشن چه کاری باید انجام بدیم؟

چون در مثال این جلسه زمانی این متدها کال شدن که در thread دیگر بودیم و از این طریق این کار انجام شد و آیا همیشه انجام این متدها در thread دیگر باید به این روش انجام بشه یا باید تغییری در متدها ایجاد کنیم؟

 

@Dao
public interface StudentDao {
    @Query(value = "SELECT * FROM tbl_student ORDER BY id DESC")
    LiveData<List<Student>> getAll();
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertStudents(List<Student> students);
    @Insert()
    void insert(Student student);
}
احمدرضا عبداللهی ۰۶ آذر ۱۴۰۳، ۱۵:۵۳

برای اجرای متدهای دیتابیس در thread دیگه، دو تا روش اصلی داریم:

روش اول - تغییر در DAO:

@Dao
public interface StudentDao {
    @Query("SELECT * FROM tbl_student ORDER BY id DESC")
    LiveData<List<Student>> getAll();
    @Insert
    Completable insert(Student student);
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    Completable insertStudents(List<Student> students);
}

و توی Repository اینطوری استفاده میکنیم:    

public class StudentRepository {
    private StudentDao dao;
    public void insertStudent(Student student) {
        dao.insert(student)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe();
    }
}

روش دوم - استفاده از ExecutorService:

public class StudentRepository {
    private StudentDao dao;
    private ExecutorService executor = Executors.newSingleThreadExecutor();
    public void insertStudent(Student student) {
        executor.execute(() -> {
            dao.insert(student);
        });
    }
}

روش اول حرفه‌ای‌تره و کنترل بیشتری روی thread‌ها داری، ولی روش دوم ساده‌تره و برای پروژه‌های کوچیک کافیه. هر دو روش درسته و بستگی به نیاز پروژه‌ات داره که کدوم رو انتخاب کنی.

بهترین پاسخ
محسن موحد ۱۱ آذر ۱۴۰۳، ۰۰:۲۵