私はライブプロジェクトに取り組んでいます。ユーザーがアプリをクリックしたとき。ようこそ画面が表示されます(その画面にはWebビューがあります)。インターネットが接続されていない場合、アプリはクラッシュします。基本的に、私の問題は、モバイルがインターネットに接続されているかどうかをプログラムで確認することです。そうでない場合は、WebサービスからWebViewにデータをフェッチせずに、「インターネット接続を確認してください」を示すダイアログボックスを表示します
研究をしながら、多くのことを発見し、それを実装しようとしました。しかし、それは私の要件を満たしていない
私のコードは、
_public boolean isOnline() {
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
else
{
Description.setVisibility(View.INVISIBLE);
new AlertDialog.Builder(WelcomePage.this)
.setTitle(getResources().getString(R.string.app_name))
.setMessage(
getResources().getString(
R.string.internet_error))
.setPositiveButton("OK", null).show();
}
return false;
}
_
AsyncTask
のdoInBackground()
でこの関数を呼び出しています
助けてください!
最後に、私は答えを得ました。
ConnectivityManager conMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = conMgr.getActiveNetworkInfo();
if (netInfo == null){
Description.setVisibility(View.INVISIBLE);
new AlertDialog.Builder(WelcomePage.this)
.setTitle(getResources().getString(R.string.app_name))
.setMessage(getResources().getString(R.string.internet_error))
.setPositiveButton("OK", null).show();
}else{
dialog = ProgressDialog.show(WelcomePage.this, "", "Loading...", true,false);
new Welcome_Page().execute();
}
このライブラリをチェックアウトできます:
https://github.com/novoda/merlin
あなたはただimplement Connectable
そして、ネットワークがダウンまたはアップしたときにコールバックを取得します。
したがって、このシナリオでダイアログを表示できます。
ライブラリに現在の状態を照会し、ネットワークタスクを実行しないように選択することもできます
Merlinの作成(Merlin.Builder()を使用)
merlin = new Merlin.Builder().withConnectableCallbacks().build(context);
アクティビティでサービスをバインドおよびバインド解除します
@Override
protected void onResume() {
super.onResume();
merlin.bind();
}
@Override
protected void onPause() {
super.onPause();
merlin.unbind();
}
コールバックに登録する
merlin.registerConnectable(new Connectable() {
@Override
public void onConnect() {
// Do something!
}
});
デモ内の MerlinActivity は、メインアプリケーションコードからMerlinを整理する簡単な方法を示しています。
インターネット接続を確認する
ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = mgr.getActiveNetworkInfo();
if (netInfo != null) {
if (netInfo.isConnected()) {
// Internet Available
}else {
//No internet
}
} else {
//No internet
}
これは、インターネット接続を確認する簡単な機能です。 Connectedはtrueを返し、そうでない場合はfalseを返します。
public boolean isInternetOn() {
// get Connectivity Manager object to check connection
ConnectivityManager connec =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
// Check for network connections
if (connec.getNetworkInfo(0).getState() == Android.net.NetworkInfo.State.CONNECTED ||
connec.getNetworkInfo(0).getState() == Android.net.NetworkInfo.State.CONNECTING ||
connec.getNetworkInfo(1).getState() == Android.net.NetworkInfo.State.CONNECTING ||
connec.getNetworkInfo(1).getState() == Android.net.NetworkInfo.State.CONNECTED) {
return true;
} else if (
connec.getNetworkInfo(0).getState() == Android.net.NetworkInfo.State.DISCONNECTED ||
connec.getNetworkInfo(1).getState() == Android.net.NetworkInfo.State.DISCONNECTED) {
return false;
}
return false;
}
}
インターネット接続を確認し、有効なまたはサーバーに含まれるURLを確認するプロジェクトを次に示します this 。
if (InternetConnection.checkConnection(context)) {
// Internet Available...
} else {
// Internet Not Available...
}
クラスの下にコピーするだけ
public class InternetConnection {
/** CHECK WHETHER INTERNET CONNECTION IS AVAILABLE OR NOT */
public static boolean checkConnection(Context context) {
final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo();
if (activeNetworkInfo != null) { // connected to the internet
Toast.makeText(context, activeNetworkInfo.getTypeName(), Toast.LENGTH_SHORT).show();
if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
// connected to wifi
return true;
} else if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
// connected to the mobile provider's data plan
return true;
}
}
return false;
}
}
マニフェストに次の許可を与える
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
上記のさまざまな方法を試しましたが、それ以外にもいくつかのケースで捕まったことがあります。最後に、以下のコードスニペットを使用してネットワーク呼び出しを行います...
try {
InetAddress address = InetAddress.getByName("www.stackoverflow.com");
//Connected to working internet connection
} catch (UnknownHostException e) {
e.printStackTrace();
//Internet not available
}
これは多くの観点で役立ちます。このアプローチでうまくいかない場合は、お知らせください。
public boolean isOnline() {
NetworkInfo activeNetworkInfo = ((ConnectivityManager)
getSystemService(CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
return activeNetworkInfo != null &&
activeNetworkInfo.isConnectedOrConnecting();
}
doInBackground
はメインUIとは異なるスレッドで実行されるため、ここにダイアログを表示することはできません。代わりに、AsyncTask
で onPreExecute をオーバーライドし、そこでテストを行います。