我正在开展一个实时项目。当用户点击应用程序时出现欢迎屏幕(该屏幕上有一个webview)。如果互联网没有连接,那么应用程序崩溃。基本上,我的问题是以编程方式检查移动设备是否连接到互联网。如果没有,则不要将数据从webservice提取到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;
}
我在doInBackground()
的{{1}}
请帮助!
答案 0 :(得分:23)
您可以结帐此库:
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的简单方法。
答案 1 :(得分:14)
最后,我得到了答案。
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();
}
答案 2 :(得分:7)
检查互联网连接
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
}
答案 3 :(得分:6)
这是检查您的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;
}
}
这是一个检查互联网连接并检查有效或包含在服务器this中的网址的项目。
答案 4 :(得分:5)
NetworkInfo
类已在API 29 (Android 10.0)
中被弃用,有关更多详细信息,请参见此处:
var isConnected = false
val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val networkCapabilities = connectivityManager.activeNetwork ?: return false
val activeNetwork = connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
isConnected = when {
activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
else -> false
}
} else {
connectivityManager.run {
activeNetworkInfo?.run {
isConnected = when (type) {
ConnectivityManager.TYPE_WIFI -> true
ConnectivityManager.TYPE_MOBILE -> true
ConnectivityManager.TYPE_ETHERNET -> true
else -> false
}
}
}
}
答案 5 :(得分:2)
我尝试过上述不同的方法,除此之外我在某些情况下被抓住了。最后,我使用下面的代码片段进行网络通话......
try {
InetAddress address = InetAddress.getByName("www.stackoverflow.com");
//Connected to working internet connection
} catch (UnknownHostException e) {
e.printStackTrace();
//Internet not available
}
这在许多方面都很有用。如果这种方法不合适,请告诉我。
答案 6 :(得分:2)
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" />
答案 7 :(得分:1)
private boolean isDeviceOnline() {
ConnectivityManager connMgr = ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
return (networkInfo != null && networkInfo.isConnected());
}
这是官方方式,Google也使用这种方式检查android设备的互联网连接。您可以在这里查看-link。 这是一种非常完美的方法,它实际上会检查互联网是否正常工作。
现在,您要解决特定的问题,请使用计时器类,然后在if(isdeviceOffline)中添加敬酒,然后进行敬酒。
答案 8 :(得分:1)
您的设备具有网络连接性并不意味着您可以访问互联网。它可以是没有互联网的wifi,也可以是没有数据包的数据SIM。 从API 23开始,您可以在下面使用它进行检查。您可以在用户界面上进行操作。或在广播接收器中。
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
Network currentnetwork = cm.getActiveNetwork();
if (currentnetwork != null) {
if (cm.getNetworkCapabilities(currentnetwork).hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && cm.getNetworkCapabilities(currentnetwork).hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
// do your stuff. We have internet.
} else {
// We have no internet connection.
}
} else {
// We have no internet connection.
}
答案 9 :(得分:0)
doInBackground
运行在与主UI不同的线程上,因此您无法在此处创建显示对话框。相反,请覆盖AsyncTask
中的onPreExecute,然后在那里进行测试。
答案 10 :(得分:0)
public boolean isOnline() {
NetworkInfo activeNetworkInfo = ((ConnectivityManager)
getSystemService(CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
return activeNetworkInfo != null &&
activeNetworkInfo.isConnectedOrConnecting();
}
答案 11 :(得分:0)
有关如何检查Internet连接的更新的Kotlin和Android 29版本(SDK 29中已弃用getNetworkInfo),适用于minSDK> = 23:
import Footer from "./Footer";
import pdf from "vue-pdf";
import db from "../db";
export default {
name: "Read",
components: {
Navbar,
Footer,
pdf,
},
data() {
return {
novel: null, // data from Firebase is saved here
src: null ,
currentPage: 0,
pageCount: 0,
numPages: undefined,
};
},
mounted() {
this.src.promise.then((pdf) => {
this.numPages = pdf.numPages;
});
},
created() {
let ref = db
.collection("Novels")
.where("novel_slug", "==", this.$route.params.novel_slug);
ref.get().then((snapshot) => {
snapshot.forEach((doc) => {
this.novel = doc.data();
this.novel.id = doc.id;
});
this.src = pdf.createLoadingTask(this.novel.novel_url);
});
},
};
</script>
答案 12 :(得分:0)
这杯代码可帮助您从API级别16到30检查互联网连接是否可用
@SuppressWarnings("deprecation")
public static boolean isInternetAvailable(Activity activity) {
ConnectivityManager conMgr = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Network network = conMgr.getActiveNetwork();
NetworkCapabilities networkCapabilities = conMgr.getNetworkCapabilities(network);
if (networkCapabilities != null) {
return networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
} else return false;
} else {
// below API Level 23
return conMgr.getActiveNetworkInfo() != null
&& conMgr.getActiveNetworkInfo().isAvailable()
&& conMgr.getActiveNetworkInfo().isConnected();
}
}
答案 13 :(得分:-2)
互联网连接也会在onCreate()
或onResume()
方法中进行检查。无需调用AsyncTask。
或者您可以在调用AsyncTask execute()方法之前调用
if(isOnline)
{
MyAsyncTask task=new MyAMyAsyncTask();
task.execute();
}
else
{
// no internet connection
}