Q:

Cargar una imagen desde una URL en un Recycler View

Estoy haciendo un ejercicio donde conecto mi aplicación con una base de datos externa, ya puedo recuperar texto almacenado en una base de datos de MySQL, tengo un campo que se llama foto, es un "varchar" y ahí almaceno una URL el problema es que cuando cargo la imagen en ImageView uso el siguiente código:
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();
            }

El problema es que me arroja el siguiente error:

6026-6026/com.example.enriq.myapplication E/AndroidRuntime: FATAL
  EXCEPTION: main
      Process: com.example.enriq.myapplication, PID: 6026
      android.os. NetworkOnMainThreadException

Mi aplicación se detiene con ese error, por lo que he leído es un error de tareas Asíncronas, solo que no se como cargar las imágenes con tareas asíncronas, todo lo estoy haciendo desde un recycler view con card views. 
Este es el código completo de mi adaptador:
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);
        }
    }
}

Esta es mi clase Usuario donde tengo todos los get y set:
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;
    }
}

Y por ultimo esta es mi clase principal donde recupero la informacion de mi base de datos con 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());
    }
}

A:

Tu error se debe a que estás solicitando una operación de red en el Thread principal, tiene que abrir otro Thread de ejecución.  Para solventar este error usa AsyncTask. 
private class CargarImagenesTask extends AsyncTask<Void, Void, Void> {

   @Override
   protected Void doInBackground(Void... params) {
        // Aquí tu codigo para llamar a la URL
   }

    @Override
    protected void onPostExecute(Void param) {
        // Envías los cambios al adaptador del recyclerview
        mAdapter.notifyDataSetChanged();
    }
}

Sin embargo puedes usar Glide como opción y te evitas usar AsyncTask así...
Primero añades la referencia de Glide a tu proyecto. 
compile 'com.github.bumptech.glide:glide:4.2.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.2.0'

En el viewHolder haces esto
@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());

    // Cambias esto para ubicar la imagen en tu recyclerview
    RequestOptions requestOptions = new RequestOptions();
    requestOptions = requestOptions.transforms(new CenterCrop(), new RoundedCorners(16));

    Glide.with(context)
        .load(listaUsuario.get(position).getFoto())
        .apply(requestOptions)
        .into(usuariosHolder.fotoRecuperado);
    }

Espero que te sea de utilidad, si necesitas que amplíe el ejemplo me lo haces saber.