Ошибка руля Volley
Я хочу обработать и показать сообщение в onErrorResponse
ниже - мой код.
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));
}
}
});
Я хочу обрабатывать com.android.volley.TimeoutError
, а также другой код ошибки, например, 404, 503 и т.д. и Toast
здесь.
Ответы
Ответ 1
NetworkResponse является нулевым, поскольку в TimeoutError данные не поступают с сервера - следовательно, время ожидания. Вместо этого вам нужны общие строки на стороне клиента для отображения, когда происходит одно из этих событий. Вы можете проверить тип VolleyError с помощью instanceof, чтобы различать типы ошибок, так как у вас нет ответа сети для работы - например:
@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
}
}
Ответ 2
Это то, что я использую в своих проектах.
@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();
}
}
Ответ 3
У вас есть TimeoutError и NoConnectionError. Супер полезно.
Ответ 4
Вы можете справиться с быстрым ответом залпа с помощью пользовательского класса залпа
как это: класс волейбола:
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;
}*/
}
Ответ 5
Подробнее об обработке ошибок в Volley на примере Android Volley с обработкой ошибок
Каждый запрос Volley имеет два обратных вызова -one для успеха и один для отказа. На основе типа параметра VolleyError в обратном вызове onErrorResponse разработчики могут показывать пользователям разумное сообщение, как показано ниже
@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
}
}
Ответ 6
/**
* Http 访问失败
*
*
*/
@Override
public void error(VolleyError error){
NetworkResponse response = error.networkResponse;
if(response != null && response.data != null){
Toast.makeText(context,"errorMessage:"+response.statusCode, Toast.LENGTH_SHORT).show();
}else{
String errorMessage=error.getClass().getSimpleName();
if(!TextUtils.isEmpty(errorMessage)){
Toast.makeText(context,"errorMessage:"+errorMessage, Toast.LENGTH_SHORT).show();
}
}
}//public void error(VolleyError error) is over! zlb