Java 在解除警报对话框之前检查网络连接
所以我有一个基于webview的应用程序。我的问题是,当出现网络丢失时调用OnReceivedError时,我想 当用户单击对话框上的“确定”以检查连接时Java 在解除警报对话框之前检查网络连接,java,android,android-webview,android-alertdialog,connectivity,Java,Android,Android Webview,Android Alertdialog,Connectivity,所以我有一个基于webview的应用程序。我的问题是,当出现网络丢失时调用OnReceivedError时,我想 当用户单击对话框上的“确定”以检查连接时 如果连接可用,则关闭警报并调用web.reload() 如果没有网络连接(wifi或移动),则调用finish() 决议如下: 将警报对话框的“发送”按钮更改为以下内容 .setPositiveButton(R.string.alert_dialog_ok,new DialogInterface.OnClickListener() {
- 如果连接可用,则关闭警报并调用
web.reload()代码>
- 如果没有网络连接(wifi或移动),则调用
finish()代码>
- 将警报对话框的“发送”按钮更改为以下内容
.setPositiveButton(R.string.alert_dialog_ok,new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int id) {
DialogInterface paramDialogInterface,int paramInt)
- 问题在于以下几点:
.setPositiveButton(R.string.alert_dialog_ok,new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int id) {
DialogInterface paramDialogInterface,int paramInt)
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.context = this;
...
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
AlertDialog.Builder localBuilder2 = new AlertDialog.Builder(
Webview_Main.this);
localBuilder2.setTitle(R.string.webview_error_received_title);
localBuilder2.setMessage(R.string.webview_error_received);
localBuilder2.setIcon(R.drawable.ic_launcher);
localBuilder2.setPositiveButton(R.string.alert_dialog_ok,new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
if(isNetworkAvailible(context))
web.reload();
else
finish();
}
};
localBuilder2.show();
};
IsNetworkAvailable类
public boolean isNetworkAvailible(Context ctx) {
NetworkInfo info = (NetworkInfo) ((ConnectivityManager) ctx
.getSystemService(Context.CONNECTIVITY_SERVICE))
.getActiveNetworkInfo();
if (info == null || !info.isConnected()) {
return false;
}
if (info.isRoaming()) {
// here is the roaming option you can change it if you want to
// disable internet while roaming, just return false
return false;
}
return true;
}
由于代码中的这个关键字引用的是DialogInterface.OnClickListener,因此没有为该类型定义getSystemService,因此必须从引用当前活动的上下文变量调用getSystemService,例如:
context.getSystemService(Activity.CONNECTIVITY_SERVICE)
由于代码中的这个关键字引用的是DialogInterface.OnClickListener,因此没有为该类型定义getSystemService,因此必须从引用当前活动的上下文变量调用getSystemService,例如:
context.getSystemService(Activity.CONNECTIVITY_SERVICE)
纠正我的回答:
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.context = this;
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
AlertDialog.Builder localBuilder2 = new AlertDialog.Builder(
Webview_Main.this);
localBuilder2.setTitle(R.string.webview_error_received_title);
localBuilder2.setMessage(R.string.webview_error_received);
localBuilder2.setIcon(R.drawable.ic_launcher);
localBuilder2.setPositiveButton(R.string.alert_dialog_ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface paramDialogInterface,int paramInt) {
if(haveInternet(context))
web.reload();
else
finish();
}
});
localBuilder2.show();
};
public boolean haveInternet(Context ctx) {
NetworkInfo info = (NetworkInfo) ((ConnectivityManager) ctx
.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if (info == null || !info.isConnected()) {
return false;
}
if (info.isRoaming()) {
// here is the roaming option you can change it if you want to
// disable internet while roaming, just return false
return false;
}
return true;
}
纠正我的回答:
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.context = this;
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
AlertDialog.Builder localBuilder2 = new AlertDialog.Builder(
Webview_Main.this);
localBuilder2.setTitle(R.string.webview_error_received_title);
localBuilder2.setMessage(R.string.webview_error_received);
localBuilder2.setIcon(R.drawable.ic_launcher);
localBuilder2.setPositiveButton(R.string.alert_dialog_ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface paramDialogInterface,int paramInt) {
if(haveInternet(context))
web.reload();
else
finish();
}
});
localBuilder2.show();
};
public boolean haveInternet(Context ctx) {
NetworkInfo info = (NetworkInfo) ((ConnectivityManager) ctx
.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if (info == null || !info.isConnected()) {
return false;
}
if (info.isRoaming()) {
// here is the roaming option you can change it if you want to
// disable internet while roaming, just return false
return false;
}
return true;
}
我可能错过了很多重要的时间,但似乎您正在创建一个
DialogInterface.OnClickListener
,但没有分配它来处理任何事情
更改您的代码:
localBuilder2.setPositiveButton(R.string.alert_dialog_ok, null);
localBuilder2.setOnClickListener(new DialogInterface.OnClickListener() {
...
});
我可能错过了很多重要的时间,但似乎您正在创建一个
DialogInterface.OnClickListener
,但没有分配它来处理任何事情
更改您的代码:
localBuilder2.setPositiveButton(R.string.alert_dialog_ok, null);
localBuilder2.setOnClickListener(new DialogInterface.OnClickListener() {
...
});
检查网络可用性 在你的活动中
if(CheckNetwork.isInternetAvailable(ActvityName.this))// pass activity context
{
//do soemthing
}
如果需要检查非活动类中的网络可用性,则需要将活动上下文作为参数传递给类构造函数并使用活动上下文
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
MyAnotherClass = new MyAnotherClass(MainActivtity.this);
}
在你们班上
Class MyAnotherClass
{
Context context;
public MyAnotherClass(Context activitycontext)
{
this.context= activitycontext;
if(CheckNetwork.isInternetAvailable(context))
{
//do something
}
}
}
支票网络类
public class CheckNetwork {
private static final String TAG = CheckNetwork.class.getSimpleName();
public static boolean isInternetAvailable(Context context)
{
NetworkInfo info = (NetworkInfo) ((ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if (info == null)
{
Log.d(TAG,"no internet connection");
return false;
}
else
{
if(info.isConnected())
{
Log.d(TAG," internet connection available...");
return true;
}
else
{
Log.d(TAG," internet connection");
return true;
}
}
}
}
检查网络可用性 在你的活动中
if(CheckNetwork.isInternetAvailable(ActvityName.this))// pass activity context
{
//do soemthing
}
如果需要检查非活动类中的网络可用性,则需要将活动上下文作为参数传递给类构造函数并使用活动上下文
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
MyAnotherClass = new MyAnotherClass(MainActivtity.this);
}
在你们班上
Class MyAnotherClass
{
Context context;
public MyAnotherClass(Context activitycontext)
{
this.context= activitycontext;
if(CheckNetwork.isInternetAvailable(context))
{
//do something
}
}
}
支票网络类
public class CheckNetwork {
private static final String TAG = CheckNetwork.class.getSimpleName();
public static boolean isInternetAvailable(Context context)
{
NetworkInfo info = (NetworkInfo) ((ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if (info == null)
{
Log.d(TAG,"no internet connection");
return false;
}
else
{
if(info.isConnected())
{
Log.d(TAG," internet connection available...");
return true;
}
else
{
Log.d(TAG," internet connection");
return true;
}
}
}
}
他指出的错误:**类型new DialogInterface的方法getSystemService(String)未定义。OnClickListener(){}**与您的answer@JackTurky感谢您编写的代码,我已经尝试过了,但是在网络恢复后按postive按钮时,语法没有错误。它只是忽略了信息。实际上不调用web.reload();当然,请参见编辑:)在您的代码中实例化了新的DialogInterface.OnClickListener,但没有添加到对话框的积极按钮中。@JackTurky根据您的建议更新了我的代码,并找到了解决方案。如果您想知道是什么解决了这个问题,请检查我更新的问题。他指出的错误:*对于类型new DialogInterface,getSystemService(String)方法未定义。OnClickListener(){}**与您的answer@JackTurky感谢您编写的代码,我已经尝试过了,语法没有错误,但是,在网络恢复后按“确认”按钮时。它只是忽略了信息。实际上不调用web.reload();当然,请参见编辑:)在您的代码中实例化了新的DialogInterface.OnClickListener,但没有添加到对话框的积极按钮中。@JackTurky根据您的建议更新了我的代码,并找到了解决方案。如果你想知道是什么解决了这个问题,请查看我更新的问题。你是对的。然而,由于WebViewClient是一个包含onReceivedError的客户端,并且WebViewClient不是从活动或类似的东西派生出来的,所以他没有现成的上下文。(S) 他需要以某种方式将该值传递给构造函数或实例。@DigCamara我已经包含了建议的上下文代码更改。然而,当按下对话框确定按钮时,它只是取消对话框。你是对的。然而,由于WebViewClient是一个包含onReceivedError的客户端,并且WebViewClient不是从活动或类似的东西派生出来的,所以他没有现成的上下文。(S) 他需要以某种方式将该值传递给构造函数或实例。@DigCamara我已经包含了建议的上下文代码更改。但是,当按下对话框确定按钮时,它只是取消对话框。