gpt4 book ai didi

java - Room 数据库、RecyclerView 和并发问题

转载 作者:行者123 更新时间:2023-12-01 18:03:11 25 4
gpt4 key购买 nike

我陷入了 Android 应用程序的开发过程中,该应用程序必须将数据存储在 SQLite 数据库(Room 数据库)中。我想做的是从 SQLite 表中检索数据并将其显示在 RecyclerView 上。但是,根据我修改代码的方式,我得到三个不同的错误输出:

1.- 如果我将数据库访问放在主线程中,则错误消息类似于:“数据库访问不得从主线程完成,因为应用程序可能会卡住”。

2.- 如果我在不同的线程中编写数据库访问代码,它会告诉我 View 只能由创建它们的线程访问。

3.- 如果我将数据库访问和 Recycler Adapter 声明放在不同的线程中,我会遇到令人恐惧的“空指针异常”,因为它找不到发送到 Adapter 对象的 ArrayList .

这是我的代码:

menuPrincipal.java:

public class menuPrincipal extends AppCompatActivity {

public BaseDatosApp basedatos;
public List<Lista> listas;
public RecyclerView rcv;
public RecyclerView.LayoutManager gestorLayouts;
private Intent actividadPrincipal;
private Button btnNuevaLista, btnAbrirLista, btnGuardarLista, btnBorrarLista;
private ManejaBotonesMnuPrinc manejador;

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu_principal);
basedatos = Room.databaseBuilder(getApplicationContext(), BaseDatosApp.class, "lista-compra").build();

Thread hilo=new Thread(new Runnable(){
@Override
public void run() {
listas = new ArrayList<>();
RecyclerAdapter rca;
basedatos.listaDao().insert(new Lista("Otra lista nueva"));
listas = basedatos.listaDao().getAll();
rca = new RecyclerAdapter(listas);
rcv = findViewById(R.id.recycler_listcom);
rcv.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
rcv.setAdapter(rca);
}
});

btnNuevaLista = findViewById(R.id.btnNuevaLista);
btnAbrirLista = findViewById(R.id.btnAbrirLista);
btnGuardarLista = findViewById(R.id.btnGuardarLista);
btnBorrarLista = findViewById(R.id.btnBorrarLista);

btnNuevaLista.setOnTouchListener(manejador);
btnAbrirLista.setOnTouchListener(manejador);
btnGuardarLista.setOnTouchListener(manejador);
btnBorrarLista.setOnTouchListener(manejador);

manejador = new ManejaBotonesMnuPrinc();

actividadPrincipal = new Intent(this, MainActivity.class);
}

RecyclerAdapter.java

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ListasViewHolder>{

public List<Lista> listasElem;

public RecyclerAdapter(List<Lista> listas){
listasElem=listas;
}

@NonNull
@Override
public ListasViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Context miContexto = parent.getContext();
int layoutIdParaListItem = R.layout.elemento_texto;
LayoutInflater inflador=LayoutInflater.from(miContexto);
boolean attachToParentRapido=false;

View vista = inflador.inflate(layoutIdParaListItem,parent,attachToParentRapido);
ListasViewHolder viewHolder = new ListasViewHolder(vista);
return viewHolder;
}

@Override
public void onBindViewHolder(@NonNull ListasViewHolder holder, int position){
holder.elementoListaView.setText(listasElem.get(position).getNombre());
}

@Override
public int getItemCount() {
return listasElem.size();
}

class ListasViewHolder extends RecyclerView.ViewHolder{
TextView elementoListaView;
public ListasViewHolder(@NonNull View itemView) {
super(itemView);
elementoListaView = itemView.findViewById(R.id.elementoLista_tv);
}
}
}

如果您有任何建议,请告诉我。

最佳答案

我建议使用 rxJava 2 来完成此任务 https://medium.com/androiddevelopers/room-rxjava-acb0cd4f3757在你的例子中,代码看起来像这样

   db.employeeDao().getAll()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<Employee>>() {
@Override
public void accept(List<Employee> employees) throws Exception {
// set data to adapter
}
});

关于java - Room 数据库、RecyclerView 和并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60598639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com