নেটওয়ার্ক সংযোগ / ইন্টারনেট অ্যাক্সেস
isConnectedOrConnecting()
(বেশিরভাগ উত্তরে ব্যবহৃত) কোনও নেটওয়ার্ক সংযোগের জন্য পরীক্ষা করে
- এই নেটওয়ার্কগুলির যে কোনও একটিতে ইন্টারনেট অ্যাক্সেস রয়েছে কিনা তা জানতে , নিম্নলিখিতগুলির মধ্যে একটি ব্যবহার করুন
ক) একটি সার্ভার পিং করুন (সহজ)
// ICMP
public boolean isOnline() {
Runtime runtime = Runtime.getRuntime();
try {
Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
int exitValue = ipProcess.waitFor();
return (exitValue == 0);
}
catch (IOException e) { e.printStackTrace(); }
catch (InterruptedException e) { e.printStackTrace(); }
return false;
}
+
মূল থ্রেড চালাতে পারে
-
কিছু পুরানো ডিভাইসে (গ্যালাই এস 3 ইত্যাদি) কাজ করে না, ইন্টারনেট না পাওয়া গেলে এটি কিছুক্ষণ অবরুদ্ধ করে।
খ) ইন্টারনেটে সকেটের সাথে সংযুক্ত (উন্নত)
// TCP/HTTP/DNS (depending on the port, 53=DNS, 80=HTTP, etc.)
public boolean isOnline() {
try {
int timeoutMs = 1500;
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);
sock.connect(sockaddr, timeoutMs);
sock.close();
return true;
} catch (IOException e) { return false; }
}
+
খুব দ্রুত (যে কোনও উপায়ে), সমস্ত ডিভাইসে কাজ করে, খুব নির্ভরযোগ্য
-
ইউআই থ্রেডে চলতে পারে না
এটি প্রতিটি ডিভাইসে খুব নির্ভরযোগ্যভাবে কাজ করে এবং খুব দ্রুত। যদিও এটি (যেমন ScheduledExecutorService
বা AsyncTask
) পৃথক টাস্কে চালানো দরকার ।
সম্ভাব্য প্রশ্ন
এটি কি আসলেই যথেষ্ট দ্রুত?
হ্যাঁ, খুব দ্রুত ;-)
ইন্টারনেটে কোনও কিছুর পরীক্ষা ব্যতীত ইন্টারনেট চেক করার কোনও নির্ভরযোগ্য উপায় নেই?
আমি যতদূর জানি না, তবে আমাকে জানান, এবং আমি আমার উত্তরটি সম্পাদনা করব।
ডিএনএস নিচে থাকলে কী হবে?
গুগল ডিএনএস (উদাঃ 8.8.8.8
) বিশ্বের বৃহত্তম পাবলিক ডিএনএস। ২০১৩ পর্যন্ত এটি একদিনে ১৩০ বিলিয়ন আবেদন করে। কেবলমাত্র এটি বলতে দিন, আপনার অ্যাপটি সম্ভবত সেই দিনের আলোচনার বিষয় নয়।
কোন অনুমতি প্রয়োজন?
<uses-permission android:name="android.permission.INTERNET" />
শুধু ইন্টারনেট অ্যাক্সেস - আশ্চর্য ^^ (বিটিডব্লিউ আপনি কি কখনও ভেবে দেখেছেন, কীভাবে এখানে প্রস্তাবিত কিছু পদ্ধতিতে এই অনুমতি ব্যতীত ইন্টারনেট অ্যাক্সেস সম্পর্কে দূরবর্তী আঠা থাকতে পারে?)
অতিরিক্ত: ওয়ান-শট AsyncTask
উদাহরণ
class InternetCheck extends AsyncTask<Void,Void,Boolean> {
private Consumer mConsumer;
public interface Consumer { void accept(Boolean internet); }
public InternetCheck(Consumer consumer) { mConsumer = consumer; execute(); }
@Override protected Boolean doInBackground(Void... voids) { try {
Socket sock = new Socket();
sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);
sock.close();
return true;
} catch (IOException e) { return false; } }
@Override protected void onPostExecute(Boolean internet) { mConsumer.accept(internet); }
}
///////////////////////////////////////////////////////////////////////////////////
// Usage
new InternetCheck(internet -> { /* do something with boolean response */ });
অতিরিক্ত: ওয়ান-শট RxJava/RxAndroid
উদাহরণ (কোটলিন)
fun hasInternetConnection(): Single<Boolean> {
return Single.fromCallable {
try {
// Connect to Google DNS to check for connection
val timeoutMs = 1500
val socket = Socket()
val socketAddress = InetSocketAddress("8.8.8.8", 53)
socket.connect(socketAddress, timeoutMs)
socket.close()
true
} catch (e: IOException) {
false
}
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
}
///////////////////////////////////////////////////////////////////////////////////
// Usage
hasInternetConnection().subscribe { hasInternet -> /* do something */}
if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ...
। এর উত্তম প্রয়োগের জন্য আমার উত্তর দেখুন । বিটিডব্লিউ গৃহীত উত্তরটি (এবং আরও অনেকে এখানে) কেবল ইন্টারনেট সংযোগ নয়, একটি নেটওয়ার্ক সংযোগের জন্য পরীক্ষা করে দেখুন।