web-dev-qa-db-ger.com

Volley-Fehler behandeln

Ich möchte eine Nachricht in onErrorResponse behandeln und anzeigen

unten ist mein Code.

String url = MainActivity.strHostUrl+"api/delete_picture"; 
jobjDeleteImage = new JsonObjectRequest(Request.Method.POST, url, jobj, new Response.Listener<JSONObject>() {

    @Override
    public void onResponse(JSONObject response) {
        Log.e("Image response", response.toString());


    }
},  new Response.ErrorListener() {

    @Override
    public void onErrorResponse(VolleyError error) {

        Log.e("Volly Error", error.toString());

        NetworkResponse networkResponse = error.networkResponse;
        if (networkResponse != null) {
            Log.e("Status code", String.valueOf(networkResponse.statusCode));
        }
    }
});

Ich möchte hier com.Android.volley.TimeoutError und auch einen anderen Fehlercode wie 404, 503 usw. und Toast behandeln.

37
Girish Bhutiya

Die networkResponse ist null, da in einem TimeoutError keine Daten vom Server empfangen werden - daher das Timeout. Stattdessen benötigen Sie generische clientseitige Zeichenfolgen, um anzuzeigen, wann eines dieser Ereignisse auftritt. Sie können anhand von instanceof nach dem Typ des VolleyError suchen, um zwischen den Fehlertypen zu unterscheiden, da Sie keine Netzwerkantwort haben, mit der Sie arbeiten können. Beispiel:

@Override
public void onErrorResponse(VolleyError error) {

    if (error instanceof TimeoutError || error instanceof NoConnectionError) {
        Toast.makeText(context,
                context.getString(R.string.error_network_timeout),
                Toast.LENGTH_LONG).show();
    } else if (error instanceof AuthFailureError) {
        //TODO
    } else if (error instanceof ServerError) {
       //TODO
    } else if (error instanceof NetworkError) {
      //TODO
    } else if (error instanceof ParseError) {
       //TODO
    }
}
106
Submersed

Sie haben auch TimeoutError und NoConnectionError. Super nützlich. 

2
Kevin Tan

Das verwende ich in meinen Projekten.

        @Override
        public void onErrorResponse(VolleyError error) {
            if(error instanceof NoConnectionError){
                ConnectivityManager cm = (ConnectivityManager)mContext
                        .getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo activeNetwork = null;
                if (cm != null) {
                    activeNetwork = cm.getActiveNetworkInfo();
                }
                if(activeNetwork != null && activeNetwork.isConnectedOrConnecting()){
                    Toast.makeText(getActivity(), "Server is not connected to internet.",
                            Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getActivity(), "Your device is not connected to internet.",
                            Toast.LENGTH_SHORT).show();
                }
            } else if (error instanceof NetworkError || error.getCause() instanceof ConnectException 
                    || (error.getCause().getMessage() != null 
                    && error.getCause().getMessage().contains("connection"))){
                Toast.makeText(getActivity(), "Your device is not connected to internet.", 
                        Toast.LENGTH_SHORT).show();
            } else if (error.getCause() instanceof MalformedURLException){
                Toast.makeText(getActivity(), "Bad Request.", Toast.LENGTH_SHORT).show();
            } else if (error instanceof ParseError || error.getCause() instanceof IllegalStateException
                    || error.getCause() instanceof JSONException
                    || error.getCause() instanceof XmlPullParserException){
                Toast.makeText(getActivity(), "Parse Error (because of invalid json or xml).", 
                        Toast.LENGTH_SHORT).show();
            } else if (error.getCause() instanceof OutOfMemoryError){
                Toast.makeText(getActivity(), "Out Of Memory Error.", Toast.LENGTH_SHORT).show();
            }else if (error instanceof AuthFailureError){
                Toast.makeText(getActivity(), "server couldn't find the authenticated request.", 
                        Toast.LENGTH_SHORT).show();
            } else if (error instanceof ServerError || error.getCause() instanceof ServerError) {
                Toast.makeText(getActivity(), "Server is not responding.", Toast.LENGTH_SHORT).show();
            }else if (error instanceof TimeoutError || error.getCause() instanceof SocketTimeoutException
                    || error.getCause() instanceof ConnectTimeoutException 
                    || error.getCause() instanceof SocketException
                    || (error.getCause().getMessage() != null 
                    && error.getCause().getMessage().contains("Connection timed out"))) {
                Toast.makeText(getActivity(), "Connection timeout error", 
                        Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getActivity(), "An unknown error occurred.", 
                        Toast.LENGTH_SHORT).show();
            }
        }
1
Naimatullah

sie können die schnelle Reaktion des Volleyballes mit einer benutzerdefinierten Volleyball-Klasse bewältigen.

import Android.content.Context;
import Android.graphics.Bitmap;
import Android.text.TextUtils;
import Android.util.LruCache;

import com.Android.volley.DefaultRetryPolicy;
import com.Android.volley.Request;
import com.Android.volley.RequestQueue;
import com.Android.volley.toolbox.ImageLoader;
import com.Android.volley.toolbox.Volley;

import static Android.content.ContentValues.TAG;

public class VolleyClass {
    private static VolleyClass mInstance;
    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;
    private Context mCtx;
    private int time = 0;

    public VolleyClass(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();

        mImageLoader = new ImageLoader(mRequestQueue,
                new ImageLoader.ImageCache() {
                    private final LruCache<String, Bitmap>
                            cache = new LruCache<>(20);

                    @Override
                    public Bitmap getBitmap(String url) {
                        return cache.get(url);
                    }

                    @Override
                    public void putBitmap(String url, Bitmap bitmap) {
                        cache.put(url, bitmap);
                    }
                });
    }

    public static synchronized VolleyClass getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new VolleyClass(context);
        }
        return mInstance;

    }

    public <T> void addToRequestQueue(Request<T> req, String tag) {
        // set the default tag if tag is empty
        req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
        req.setRetryPolicy(new DefaultRetryPolicy(
                time,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        getRequestQueue().add(req);
    }

    private RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            // getApplicationContext() is key, it keeps you from leaking the
            // Activity or BroadcastReceiver if someone passes one in.
            //mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
         mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext(), new OkHttpStack(new com.squareup.okhttp.OkHttpClient()));
        }
        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {

        req.setRetryPolicy(new DefaultRetryPolicy(
                time,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        getRequestQueue().add(req);
    }




    /*public ImageLoader getImageLoader() {
        return mImageLoader;
    }*/
}

Sinc gradle mit Compile 'com.Android.volley: volley: 1.0.0' Compile 'com.squareup.okhttp3: okhttp: 3.8.1'

Initialisieren Sie die Volleyklasse: VolleyClass volleyClass; volleyClass = neue VolleyClass (diese); // unter onCreate Rufen Sie dann die Methode für die Operation

    private void serverCall() {
        final ProgressDialog mDialog = new ProgressDialog(SettingActivity.this);
        mDialog.setMessage("Please wait...");
        mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        mDialog.setIndeterminate(true);
        mDialog.setCancelable(false);
        mDialog.show();


        JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, "your url", null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {


                mDialog.dismiss();


            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // TODO Auto-generated method stub
                mDialog.dismiss();

            }
        }) {

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("Content-Type", "application/json; charset=utf-8");
                headers.put("User-agent", System.getProperty("http.agent"));
                return headers;
            }

            @Override
            public Priority getPriority() {
                return Priority.IMMEDIATE;
            }
        };

        volleyClass.addToRequestQueue(jsObjRequest);

    }

private void networkCallPostData () {

    StringRequest stringRequest = new StringRequest(Request.Method.POST, "url",

            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Log.e("response", response);

                }
            }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {

            System.out.println("VolleyError " + error.getMessage());
        }
    }) {
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("id",app.getAppSettings().__uId);
            return params;
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> headers = new HashMap<String, String>();
            //headers.put("Content-Type", "application/json; charset=utf-8");
            headers.put("Content-Type", "multipart/form-data");
            headers.put("User-agent", System.getProperty("http.agent"));
            return headers;
        }

        @Override
        public Priority getPriority() {
            return Priority.IMMEDIATE;
        }

    };
    volleyClass.addToRequestQueue(stringRequest);
}

0
Nur Gazi

Weitere Informationen zu Volley Error Handling finden Sie unter Android Volley-Beispiel mit Fehlerbehandlung

Jede Volley-Anforderung hat zwei Rückrufe - einen für den Erfolg und einen für einen Fehler. Basierend auf dem Typ des VolleyError-Parameters in den Callback-Entwicklern von onErrorResponse können die Benutzer den Benutzern eine sinnvolle Nachricht anzeigen, wie unten gezeigt

@Override
public void onErrorResponse (VolleyError error){

   if (error instanceof TimeoutError || error instanceof NoConnectionError) {
     //This indicates that the reuest has either time out or there is no connection

   } else if (error instanceof AuthFailureError) {
     // Error indicating that there was an Authentication Failure while performing the request

   } else if (error instanceof ServerError) {
     //Indicates that the server responded with a error response

   } else if (error instanceof NetworkError) {
     //Indicates that there was network error while performing the request

   } else if (error instanceof ParseError) {
      // Indicates that the server response could not be parsed

   }
}
0
IrshadKumail