如何在单击一个按钮的方法中执行2个动作

时间:2019-02-18 08:07:40

标签: java android

我有一个执行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());
        }
    }

4 个答案:

答案 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)

或者,请在下面的解决方案中进行检查:

Check connectivity

创建检查连接方法后,请在单击按钮的onHistoryClick方法中使用该功能。

答案 3 :(得分:0)

异步操作后,

isOnline()设置isInternetConnected = true。本质上,您不是在等待该标志的设置/重置并执行if(isInternetConnected == true)。您应该链接这两个过程,即从get data from server if there is internet/server connection知道异步操作已完成之后,执行isOnline()的第二个任务。

单独运行这两个相关任务在这里无济于事。