Bevor ich Volley verwende, habe ich, wie üblich, mit AsyncTask meinen Internet-Status überprüft.
Folgendes habe ich in AsyncTask gemacht:
private class NetCheck extends AsyncTask<String, Void, Boolean> {
@Override
protected Boolean doInBackground(String... args) {
// get Internet status
return cd.isConnectingToInternet();
}
protected void onPostExecute(Boolean th) {
if (th == true) {
new LoadCategories().execute();
} else {
Toast.makeText(CategoryActivity.this, "Unable to connect to server",
Toast.LENGTH_LONG).show();
}
}
}
Und das ist isConnectingToInternet
Funktion:
public boolean isConnectingToInternet() {
ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo info = connectivity.getActiveNetworkInfo();
if (info != null && info.isConnected())
try {
URL url = new URL("http://www.google.com");
HttpURLConnection urlc = (HttpURLConnection) url
.openConnection();
urlc.setConnectTimeout(3000);
urlc.connect();
if (urlc.getResponseCode() == 200) {
return true;
}
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return false;
}
Wie erreiche ich das mit Volley?
Es gibt einen NoConnection-Fehler, der für die Anforderung ausgegeben wird. Bitte fangen Sie den Fehler ein
@Override
public void onErrorResponse(VolleyError volleyError) {
String message = null;
if (volleyError instanceof NetworkError) {
message = "Cannot connect to Internet...Please check your connection!";
} else if (volleyError instanceof ServerError) {
message = "The server could not be found. Please try again after some time!!";
} else if (volleyError instanceof AuthFailureError) {
message = "Cannot connect to Internet...Please check your connection!";
} else if (volleyError instanceof ParseError) {
message = "Parsing error! Please try again after some time!!";
} else if (volleyError instanceof NoConnectionError) {
message = "Cannot connect to Internet...Please check your connection!";
} else if (volleyError instanceof TimeoutError) {
message = "Connection TimeOut! Please check your internet connection.";
}
}
Ich verwende den folgenden Code, um festzustellen, welcher Fehler auftritt:
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (error instanceof TimeoutError || error instanceof NoConnectionError) {
Toast.makeText(getApplicationContext(), "Communication Error!", Toast.LENGTH_SHORT).show();
} else if (error instanceof AuthFailureError) {
Toast.makeText(getApplicationContext(), "Authentication Error!", Toast.LENGTH_SHORT).show();
} else if (error instanceof ServerError) {
Toast.makeText(getApplicationContext(), "Server Side Error!", Toast.LENGTH_SHORT).show();
} else if (error instanceof NetworkError) {
Toast.makeText(getApplicationContext(), "Network Error!", Toast.LENGTH_SHORT).show();
} else if (error instanceof ParseError) {
Toast.makeText(getApplicationContext(), "Parse Error!", Toast.LENGTH_SHORT).show();
}
}
});
Verwenden Sie diesen Code zum Überprüfen des Internetstatus:
public class Internet {
private Context context;
public Internet(Context context) {
this.context = context;
}
public Boolean Check() {
ConnectivityManager cn = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo nf = cn.getActiveNetworkInfo();
if (nf != null && nf.isConnected() == true) {
return true;
} else {
Toast.makeText(context, "No internet connection.!",
Toast.LENGTH_LONG).show();
return false;
}
}
}
Dies ist, wie ich eine Volley-Anfrage mache und mit Antworten und Fehlern umgehe. Sie müssen keine Async-Aufgabe hinzufügen. Volley-Anfrage im Backend
StringRequest strReq = new StringRequest(Request.Method.POST, "your_url", new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// handle your response here
// if your response is a json then create json object and use it
try {
JSONObject jsonObject = new JSONObject(response);
// now you can get values from your jsonObject
}
catch (Exception e){}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
String message = null; // error message, show it in toast or dialog, whatever you want
if (volleyError instanceof NetworkError || volleyError instanceof AuthFailureError || volleyError instanceof NoConnectionError || volleyError instanceof TimeoutError) {
message = "Cannot connect to Internet";
} else if (volleyError instanceof ServerError) {
message = "The server could not be found. Please try again later";
} else if (volleyError instanceof ParseError) {
message = "Parsing error! Please try again later";
}
}
}) {
@Override
public byte[] getBody() throws AuthFailureError {
HashMap<String, String> params = new HashMap<>();
params.put("key","value"); // put your params here
return new JSONObject(params).toString().getBytes();
}
@Override
public String getBodyContentType() {
return "application/json";
}
};
// Adding String request to request queue
Volley.newRequestQueue(getApplicationContext()).add(strReq);
Ich kann das Internet in der Anwendungsklasse überprüfen
public class App extends Application {
private static final String TAG = "MyApp";
private static App mInstance;
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
public static synchronized App getInstance() {
return mInstance;
}
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req, String tag) {
// set the default tag if tag is empty
req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
getRequestQueue().add(req);
}
public <T> void addToRequestQueue(Request<T> req) {
if(CommonUtills.isNetworkAvailable(getApplicationContext())) {
req.setRetryPolicy(new DefaultRetryPolicy(
60000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
req.setTag(TAG);
getRequestQueue().add(req);
}
else
{
Toast.makeText(getApplicationContext(), "Unable to
connect to server",Toast.LENGTH_LONG).show();
}
}
public void cancelPendingRequests(Object tag) {
if (mRequestQueue != null) {
mRequestQueue.cancelAll(tag);
}
}
}
Ich rufe jeden Netzwerkanruf auf folgende Weise an
App.getInstance().addToRequestQueue(jsonObjRequest);
Bevor Sie also jede Anforderung aufrufen, wird sie ausgeführt, wenn Internet verfügbar ist
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
if (volleyError instanceof TimeoutError || volleyError instanceof NoConnectionError) {
Toast.makeText(getApplicationContext(), "No Connection/Communication Error!", Toast.LENGTH_SHORT).show();
} else if (volleyError instanceof AuthFailureError) {
Toast.makeText(getApplicationContext(), "Authentication/ Auth Error!", Toast.LENGTH_SHORT).show();
} else if (volleyError instanceof ServerError) {
Toast.makeText(getApplicationContext(), "Server Error!", Toast.LENGTH_SHORT).show();
} else if (volleyError instanceof NetworkError) {
Toast.makeText(getApplicationContext(), "Network Error!", Toast.LENGTH_SHORT).show();
} else if (volleyError instanceof ParseError) {
Toast.makeText(getApplicationContext(), "Parse Error!", Toast.LENGTH_SHORT).show();
}
}
});
Das ist gut für Sie als Entwickler. Zeigen Sie dem Endbenutzer jedoch einige dieser direkten Nachrichten wie auth und serverseitigen Fehler nicht an. Seien Sie kreativ und zeigen Sie etwas, das sich im Moment nicht verbinden lässt.