通常どおりVolleyを使用する前に、AsyncTaskを使用してインターネットの状態を確認しました。
これは私がAsyncTaskでやったことです:
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();
}
}
}
そして、これはisConnectingToInternet
関数です:
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;
}
ボレーを使用してこれをどのように達成しますか?
リクエストに対してスローされるNoConnectionエラーがあります。エラーをキャッチしてください
@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.";
}
}
以下のコードを使用して、発生しているエラーを検出します。
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();
}
}
});
このコードを使用してインターネットの状態を確認します。
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;
}
}
}
これは、私がボレーリクエストを作成し、応答とエラーを処理する方法です。このために非同期タスクを追加する必要はありません。
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);
Applicationクラスでインターネットをチェックすることに成功しました
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);
}
}
}
そして、私は毎回次の方法を使用して各ネットワークコールを呼び出しています
App.getInstance().addToRequestQueue(jsonObjRequest);
したがって、各リクエストを呼び出す前に、インターネットが利用可能な場合に実行されます
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();
}
}
});
これは、開発者にとっては良いことです。ただし、authやサーバー側のエラーなど、このダイレクトメッセージの一部をエンドユーザーに表示しないでください。クリエイティブになり、現時点では接続できないようなものを示します。