我正在做一个练习,我将我的应用程序与外部数据库连接起来,我现在可以检索存储在 MySQL 数据库中的文本,我有一个名为 photo 的字段,它是一个“varchar”,我在那里存储了一个 URL 问题是当我在 ImageView 中加载图像我使用以下代码:
try {
URL url = new URL(listaUsuario.get(position).getFoto().toString());
Bitmap image =
BitmapFactory.decodeStream(url.openConnection().getInputStream());
usuariosHolder.fotoUsuario.setImageBitmap(image);
} catch (MalformedURLException e) {
Log.i("Rashomu","Error: "+e);
e.printStackTrace();
} catch (IOException e) {
Log.i("Raiton","Error: "+e);
e.printStackTrace();
}
问题是它给了我以下错误:
6026-6026/com.example.enriq.myapplication E/AndroidRuntime:致命异常:主进程:com.example.enriq.myapplication,PID:6026 android.os.NetworkOnMainThreadException
我的应用程序因此错误而停止,从我所读的内容来看,这是一个异步任务错误,我只是不知道如何使用异步任务加载图像,我正在从带有卡片视图的回收器视图中做所有事情。
这是我的适配器的完整代码:
public class UsuariosAdapter extends RecyclerView.Adapter<UsuariosAdapter.UsuariosHolder> {
List<Usuario> listaUsuario;
public UsuariosAdapter(List<Usuario> listaUsuario){
this.listaUsuario = listaUsuario;
}
@Override
public UsuariosAdapter.UsuariosHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_usuarios,parent,false);
RecyclerView.LayoutParams layoutParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
view.setLayoutParams(layoutParams);
return new UsuariosHolder(view);
}
@Override
public void onBindViewHolder( UsuariosAdapter.UsuariosHolder usuariosHolder, int position) {
usuariosHolder.nombreRecuperado.setText(listaUsuario.get(position).getNombre());
usuariosHolder.apellidoRecuperado.setText(listaUsuario.get(position).getApellido());
usuariosHolder.direccionRecuperado.setText(listaUsuario.get(position).getDireccion());
usuariosHolder.fotoRecuperado.setText(listaUsuario.get(position).getFoto());
try {
URL url = new URL(listaUsuario.get(position).getFoto().toString());
Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
usuariosHolder.fotoUsuario.setImageBitmap(image);
} catch (MalformedURLException e) {
Log.i("Rashomu","Error: "+e);
e.printStackTrace();
} catch (IOException e) {
Log.i("Raiton","Error: "+e);
e.printStackTrace();
}
}
@Override
public int getItemCount() {
return listaUsuario.size();
}
public class UsuariosHolder extends RecyclerView.ViewHolder{
TextView nombreRecuperado, apellidoRecuperado, direccionRecuperado, fotoRecuperado;
ImageView fotoUsuario;
public UsuariosHolder(View itemView){
super(itemView);
nombreRecuperado = (TextView)itemView.findViewById(R.id.tituloUsuario);
apellidoRecuperado = (TextView)itemView.findViewById(R.id.apellidoUsuario);
fotoRecuperado = (TextView)itemView.findViewById(R.id.imagenUsuario);
direccionRecuperado = (TextView)itemView.findViewById(R.id.direccionUsuario);
fotoUsuario = (ImageView)itemView.findViewById(R.id.fotoUsuario);
}
}
}
这是我的用户类,我拥有所有的获取和设置:
package com.example.enriq.myapplication.Entidades;
public class Usuario {
private String nombre;
private String apellido;
private String direccion;
private String foto;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellido() {
return apellido;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
public String getDireccion() {
return direccion;
}
public void setDireccion(String direccion) {
this.direccion = direccion;
}
public String getFoto() {
return foto;
}
public void setFoto(String foto) {
this.foto = foto;
}
}
最后这是我的主要课程,我使用 JSON 从数据库中检索信息:
public class ConsultarLista extends AppCompatActivity implements Response.Listener<JSONObject>, Response.ErrorListener {
RecyclerView recyclerView;
ArrayList<Usuario> listaUsuario;
RequestQueue request;
JsonObjectRequest jsonObjectRequest;
public ConsultarLista() {
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_consultar_lista);
listaUsuario = new ArrayList<>();
recyclerView = (RecyclerView)findViewById(R.id.recyclerviewU);
recyclerView.setLayoutManager(new LinearLayoutManager(this.getApplicationContext()));
recyclerView.setHasFixedSize(true);
request = Volley.newRequestQueue(getApplicationContext());
cargarWebService();
}
private void cargarWebService() {
String url = "http://192.168.1.81:80/webservice/consultarLista.php";
jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,url,null,this,this);
request.add(jsonObjectRequest);
}
@Override
public void onResponse(JSONObject response) {
Usuario usuario = null;
JSONArray json = response.optJSONArray("usuario");
try{
for (int i=0; i<json.length(); i++){
usuario = new Usuario();
JSONObject jsonObject = null;
jsonObject = json.getJSONObject(i);
usuario.setNombre(jsonObject.optString("nombre"));
usuario.setApellido(jsonObject.optString("apellido"));
usuario.setDireccion(jsonObject.optString("direccion"));
usuario.setFoto(jsonObject.optString("foto"));
listaUsuario.add(usuario);
}
UsuariosAdapter adapter = new UsuariosAdapter(listaUsuario);
recyclerView.setAdapter(adapter);
}catch (JSONException e){
e.printStackTrace();
}
}
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(),"No se pudo consultar los registros: "+error.toString(), Toast.LENGTH_LONG).show();
Log.i("Error","No se pudo consultar el registro: "+error.toString());
}
}
您的错误是因为您在
Thread
主请求网络操作,它必须打开另一个Thread
执行。要解决此错误,请使用AsyncTask
.但是,您可以使用 Glide 作为选项并避免
AsyncTask
像那样使用它...首先,将 Glide 引用添加到您的项目中。
在
viewHolder
做这个我希望它对您有用,如果您需要我扩展示例,请告诉我。