Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 房间数据库、RecyclerView和并发问题_Java_Android_Database_Android Recyclerview_Concurrency - Fatal编程技术网

Java 房间数据库、RecyclerView和并发问题

Java 房间数据库、RecyclerView和并发问题,java,android,database,android-recyclerview,concurrency,Java,Android,Database,Android Recyclerview,Concurrency,我一直在开发一款Android应用程序,它必须将数据存储在SQLite数据库(Room数据库)中。我试图做的是从SQLite表中检索数据,并将其显示在RecyclerView上。但是,根据修改代码的方式,我会得到三种不同的错误输出: 1.-如果我将数据库访问放在主线程中,错误消息类似于:“不能从主线程访问数据库,因为应用程序可能会冻结” 2.-如果我在另一个线程中编写数据库访问代码,它会告诉我视图只能由创建它们的线程来处理 3.-如果我将数据库访问和回收器适配器声明放在不同的线程中,我会得到令人

我一直在开发一款Android应用程序,它必须将数据存储在SQLite数据库(Room数据库)中。我试图做的是从SQLite表中检索数据,并将其显示在RecyclerView上。但是,根据修改代码的方式,我会得到三种不同的错误输出:

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

2.-如果我在另一个线程中编写数据库访问代码,它会告诉我视图只能由创建它们的线程来处理

3.-如果我将数据库访问和回收器适配器声明放在不同的线程中,我会得到令人担忧的“空指针异常”,因为它无法找到发送到适配器对象的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);
}
public类menuPrincipal扩展了AppCompatActivity{
公共数据库;应用数据库;
公开名单;
公共垃圾回收站;
公共资源视图。布局管理器管理布局;
私人意图;
专用按钮btnNuevaLista、btnAbrirLista、btnGuardarLista、BTNBorArlista;
私人曼内贾博通斯姆普林斯曼内贾多尔;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u menu\u principal);
basedatos=Room.databaseBuilder(getApplicationContext(),BaseDatosApp.class,“lista compra”).build();
Thread hilo=新线程(new Runnable()){
@凌驾
公开募捐{
listas=newarraylist();
回收适配器rca;
basedatos.listaDao().insert(新列表(“Otra Lista nueva”);
listas=basedatos.listaDao().getAll();
rca=新的回收适配器(列表);
rcv=findViewById(R.id.recycler\u listcom);
rcv.setLayoutManager(新的LinearLayoutManager(getApplicationContext());
rcv.setAdapter(rca);
}
});
btnNuevaLista=findViewById(R.id.btnNuevaLista);
btnAbrirLista=findViewById(R.id.btnAbrirLista);
btnGuardarLista=findViewById(R.id.btnGuardarLista);
btnborrallista=findViewById(R.id.btnborrallista);
btnNuevaLista.setOnTouchListener(manejador);
btnAbrirLista.setOnTouchListener(manejador);
b NguardArlista.setOnTouchListener(manejador);
btnborralista.setOnTouchListener(manejador);
manejador=新的ManejaBotonesMnuPrinc();
actividadPrincipal=新意图(此,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);
        }
    }
}
公共类RecyclerAdapter扩展了RecyclerView.Adapter{ 公共列表列表; 公共回收适配器(列表){ listasElem=listas; } @非空 @凌驾 public ListasViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){ Context-miContexto=parent.getContext(); int layoutdparalistItem=R.layout.elemento_texto; LayoutFlater Inflator=LayoutFlater.from(micontextro); 布尔attachToParentRapido=false; View vista=inflador.inflate(布局ParalistItem、父项、attachToParentRapido); ListasViewHolder viewHolder=新的ListasViewHolder(vista); 返回视图持有者; } @凌驾 public void onBindViewHolder(@NonNull ListasViewHolder,int位置){ holder.elementoListaView.setText(listasElem.get(position.getNombre()); } @凌驾 public int getItemCount(){ 返回listasElem.size(); } 类ListasViewHolder扩展了RecyclerView.ViewHolder{ TextView元素静态视图; public ListasViewHolder(@NonNull View itemView){ 超级(项目视图); elementoListaView=itemView.findviewbyd(R.id.elementoLista_tv); } } }
如果您有任何建议,请告诉我。

我建议在您的情况下使用rxJava 2完成此任务,代码将如下所示

   db.employeeDao().getAll()
   .observeOn(AndroidSchedulers.mainThread())
   .subscribe(new Observer<List<Employee>>() {
       @Override
       public void accept(List<Employee> employees) throws Exception {
           // set data to adapter
       }
   });
db.employeeDao().getAll()
.observeOn(AndroidSchedulers.mainThread())
.订阅(新观察员){
@凌驾
public void accept(列出员工)引发异常{
//将数据设置为适配器
}
});

按照本教程进行操作,并查看您的应用程序。