私はjavaとandroidを使い慣れていますが、学生が自分のコンテンツの一部私のクラス(私は次の学期までに彼らのために準備したいと思っています)。Googleがサインインやその他のネットワークアクティビティの前にインターネット接続を使用するかどうかをチェックするパブリッククラス
メールアドレス(Googleアカウント)でアプリにログインできるようにしたいと思っています。また、各部門のクイズが含まれています(パフォーマンスがメールで返信されます)。私はネットワーク関連のタスクが実行される前にアクティブな接続が利用可能であることを確認したいと思います。自分のコードを公式化しようとすると、多くのSO質問(Detect if android device is connected to the internet; Detect whether there is an Internet connection available on Android; How to check internet access on Android? InetAddress never times out;; How to check internet access on Android? InetAddress never times out; How to check internet access on Android? InetAddress never times out;など)を見てきましたが、ネットワーク要求を確実にするためにAsyncTaskの使い方を理解できませんNetworkOnMainThreadExceptionの発生を防ぐためにメインスレッドによって実行されていません。私のアプリでサインインまたはグレード送信アクションを実行する前に、AsycTaskまたはスレッドを使用してインターネットチェックを実行する正しい方法を教えてください。
はsignInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isNetworkAvailable(getApplicationContext())) {
progressDialog.show();
Intent intent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(intent, LOGIN_GOOGLE_NUMBER);
} else {
Toast.makeText(getApplicationContext(), "Please ensure that you are connected to the Internet and then try again", Toast.LENGTH_LONG).show();
}
}
});
メインサインインもクラスの一部であるインターネット接続をチェックするためのメソッドは次のようになります。私は次のように活動に記号を扱う私の活動から、私のisNetworkAvailableメソッドを呼び出しています現時点では
この:// Check if the network is connected (and if Internet is working)
private boolean isNetworkAvailable(Context context) {
//final ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
//return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected();
boolean connected = false;
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED ||
connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {
//we are connected to a network
connected = true;
} else
connected = false;
if (connected) {
checkConnectivity isConnected = new checkConnectivity();
if (isConnected.hasInternetAccess(getApplicationContext())) {
return true;
} else
return false;
} else
return false;
}
と私は別のパブリッククラスとしてアプリを通じてアクセス可能になりたかったAsyncTaskを参照する:
public class checkConnectivity extends AsyncTask<Activity, Void, Boolean> {
private static final String TAG = "MyApplication Context";
protected Boolean doInBackground(Activity... activitys) {
return hasInternetAccess(activitys[0]);
}
// To check for internet before performing sign in activity
public boolean hasInternetAccess(Context context) {
try {
HttpURLConnection urlc = (HttpURLConnection)
(new URL("http://clients3.google.com/generate_204")
.openConnection());
urlc.setRequestProperty("User-Agent", "Android");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1500);
urlc.connect();
return (urlc.getResponseCode() == 204 &&
urlc.getContentLength() == 0);
} catch (IOException e) {
Log.e(TAG, "Error checking internet connection", e);
}
return false;
}
}
私はこれを段階的にコーディングしています。ネットワーク接続をテストするセクションがあればうまく動作しますが、http urlリクエストを追加しようとすると問題が発生します。
インターネット接続があることを確認するためにアプリケーションのさまざまな場所で使用できるパブリッククラスを定義する正しい方法と、その特定のアクティビティでの呼び出し方法を教えてください。どんな助けでも大歓迎です。
代のための1つのサンプル方法を
を呼び出すAPI前のイオンは、あなたが 'AsyncTask'に、アクティビティを渡しています。これは、あなたのアプリでメモリリークを引き起こす可能性がありますしてはいけません。また、キャッシングなどのネットワーキング関連のもののほとんどを処理するネットワーキングライブラリを使用することができます。 –
https://stackoverflow.com/a/42229749/5610842 これをチェックして問題があれば教えてください。 – RaghavPai