我有一个执行2个动作的按钮。一种是检查Internet /服务器连接,另一种是从Internet /服务器连接中获取服务器数据。
我现在面临的问题是我的按钮将仅执行检查Internet /服务器连接的操作,而不会跟进该连接的结果以进行下一个操作。
但是,当我再次按下按钮时,它将执行第二个操作。
我的代码有问题吗?我需要一些建议。
检查Internet /服务器连接
public Boolean isOnline() {
try {
p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = p1.waitFor();
boolean reachable = (returnVal == 0);
if (reachable) {
new uploadDB(new uploadDB.returnResult() {
@Override
public void onFinish(String result) {
if (result.equalsIgnoreCase("success")) {
isInternetConnected = true;
} else {
isInternetConnected = false;
showdialog("No Internet Connection", "Connection to server failed.");
}
}
}).execute("ping");
} else {
isInternetConnected = false;
showdialog("No Internet", "Internet connection is needed to perform certain actions.");
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
按钮单击
@Override
public void onHistoryClick(final int position) {
isOnline();
if(isInternetConnected == true)
{
runOnUiThread(new Runnable() {
@Override
public void run() {
pd.setMessage("Retrieving History Information...");
pd.setIndeterminate(true);
pd.setCancelable(false);
pd.show();
}
});
new uploadDB(new uploadDB.returnResult() {
@Override
public void onFinish(String result) {
if(result != null)
{
Intent intent = new Intent(MainActivity.this, HistoryYearActivity.class);
intent.putExtra("barrelUUID", barrelList.get(position).getBeaconUUID());
intent.putExtra("barrelName", barrelList.get(position).getBarrelName());
intent.putExtra("result", result);
startActivity(intent);
pd.dismiss();
}
}
}).execute("historypageall",barrelList.get(position).getBeaconUUID());
}
}
答案 0 :(得分:1)
您真的要ping google.com并查看互联网连接吗?您可以尝试下面的教程,其中介绍了如何检查互联网。
https://www.androidhive.info/2012/07/android-detect-internet-connection-status/
不过,如果您想使用自己的方法,那么您需要创建一个AsyncTask,它将对google.com进行ping操作并响应true或false,然后在onPostExecute内根据true或false进行实际操作。这样,只需一个方法调用,即可完成两个任务。
异步任务教程-https://www.journaldev.com/9708/android-asynctask-example-tutorial
private class MyAsyncTask extends AsyncTask<String, String, Boolean> {
@Override
protected String doInBackground(String... params) {
//put your code that checks internet connectivity here.
//return true if internet is connected else return false/
}
@Override
protected void onPostExecute(Boolean result) {
//the result variable contains the value returned from doInBackground.
if(result){
//do what you want to do when the internet is there
//I believe here you need to write history related task that you are trying to do.
} else{
//show Toast or Alert mentioning that no internet is available.
}
}
}
希望这会有所帮助。
答案 1 :(得分:1)
使用此方法检查互联网连接
public static boolean checkInternet(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
// Log.v("INTERNET", "Available");
return true;
}
return false;
}
然后您可以像处理
if(checkInternet(context)) {
// Internet is available
}
高级:
如果要在完成Internet检查过程时使用侦听器和回调,则只需调用接口方法即可。
interface InternetCheck {
void isAvailable();
void isNotAvailable();
}
public Boolean isOnline(InternetCheck internetCheck) {
try {
p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = p1.waitFor();
boolean reachable = (returnVal == 0);
if (reachable) {
new uploadDB(new uploadDB.returnResult() {
@Override
public void onFinish(String result) {
if (result.equalsIgnoreCase("success")) {
isInternetConnected = true;
internetCheck.isAvailable();
} else {
isInternetConnected = false;
internetCheck.isNotAvailable();
showdialog("No Internet Connection", "Connection to server failed.");
}
}
}).execute("ping");
} else {
isInternetConnected = false;
internetCheck.isNotAvailable();
showdialog("No Internet", "Internet connection is needed to perform certain actions.");
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public void yourButtonClickEvent() {
isOnline(new InternetCheck() {
@Override
public void isAvailable() {
// Now Internet is available
}
@Override
public void isNotAvailable() {
}
});
}
答案 2 :(得分:0)
您的isOnline()
方法将始终返回false
。由于您没有在try
块中返回任何值。
在下面找到链接以检查您的互联网连接
Check connectivity (developer.android)
或者,请在下面的解决方案中进行检查:
创建检查连接方法后,请在单击按钮的onHistoryClick
方法中使用该功能。
答案 3 :(得分:0)
isOnline()
设置isInternetConnected = true
。本质上,您不是在等待该标志的设置/重置并执行if(isInternetConnected == true)
。您应该链接这两个过程,即从get data from server if there is internet/server connection
知道异步操作已完成之后,执行isOnline()
的第二个任务。
单独运行这两个相关任务在这里无济于事。