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
メッセージを処理したい。
TimeoutErrorではサーバーからデータを受信しないため、networkResponseはnullです。したがって、タイムアウトになります。代わりに、これらのイベントの1つが発生したときに表示する汎用クライアント側の文字列が必要です。 instanceofを使用してVolleyErrorのタイプを確認し、作業するネットワーク応答がないため、エラータイプを区別できます。
@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
}
}
TimeoutErrorとNoConnectionErrorもあります。とても便利です。
これが私のプロジェクトで使用しているものです。
@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();
}
}
次のようなカスタムボレークラスでボレーのクイックレスポンスを処理できます:ボレークラス:
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;
}*/
}
コンパイル 'com.Android.volley:volley:1.0.0'でコンパイル 'com.squareup.okhttp3:okhttp:3.8.1'を使用したSinc gradle
ボレークラスを初期化します:VolleyClass volleyClass; volleyClass = new VolleyClass(this); // onCreateの下で、操作1.rowデータのメソッドを呼び出します。
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);
}
Volleyエラー処理の詳細については、 Android Volley example with Error Handling をご覧ください。
すべてのVolleyリクエストには、成功用と失敗用の2つのコールバックがあります。onErrorResponseコールバックのVolleyErrorパラメータのタイプに基づいて、開発者は以下に示すようにユーザーに適切なメッセージを表示できます。
@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
}
}