У меня есть операция SQLite DatabaseHelper, которая вставляет строку в локальную базу данных.Я хочу сделать это в другом потоке и использовать обработчик для возврата результата в поток пользовательского интерфейса.Как я могу это сделать?Вот операция:
public void insertEmployee(String employeeType, String employeeName, Double employeeConvRate, String employeeDesc) {
new Thread(() -> {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(EXPENSE_C_TYPE, employeeType);
values.put(EXPENSE_C_NAME, employeeName);
values.put(EXPENSE_C_CR, employeeConvRate);
values.put(EXPENSE_C_DESC, employeeDesc);
long id = db.insert(EXPENSE_TABLE_NAME, null, values);
db.close();
}).start();
}
Обычно эта функция является публичной длинной, которая возвращает переменную id.
РЕДАКТИРОВАТЬ - КАК Я ЭТО СДЕЛАЛ:
Я создал этот интерфейс с универсальным параметром:
public interface OnDatabaseResult<T> {
void onResult(T result);
}
Затем я изменил обработчик внутри операции базы данных:
public void insertEmployee(String employeeType, String employeeName, Double employeeConvRate, String employeeDesc) {
new Thread(() -> {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(EXPENSE_C_TYPE, employeeType);
values.put(EXPENSE_C_NAME, employeeName);
values.put(EXPENSE_C_CR, employeeConvRate);
values.put(EXPENSE_C_DESC, employeeDesc);
long id = db.insert(EXPENSE_TABLE_NAME, null, values);
db.close();
handler.post(()) -> onDatabaseResult.onResult(id)
}).start();
}
Затем в основное действие я добавил функцию, которая создает строку:
public void createEmploye(String employeeType, String employeeName, Double employeeConvRate, String employeeDesc){
DatabaseHelper databaseHelper = new DatabaseHelper(this);
databaseHelper.insertEmployee(type, name, rate, desc, new OnDatabaseResult<Long>(){
@Override
public void onResult(Long result){
Employee employee = databaseHelper.getEmployee(result);
if(employee!=null){
employeeList.add(o, employee);
employeeAdapter.notifyDataSetChanged();
}
}
});
}
А теперь работает без нареканий.