在我的代码中,我有很多这样的实例:
if (!valid){
validate();
}
if (valid){
\\ execute some code
}
我想知道是否有更好的方法来做到这一点?首先,我必须编写一堆连续的if语句,其次,validate()
中的部分代码要求我加载带有登录页面的webview,然后登录,这很烦人。一旦我到达登录页面,我使用JavaScript检索一个值,然后将valid
的值更改为true(如果匹配)。没有真正方便的until
功能,使用while(!valid)
并不能完全满足我的需求。
这是我的validate()
private void validate(){
class MyJavaScriptInterface {
@JavascriptInterface
public void showHTML(String content) {
// grants access based on authorization level
loggedIn = true;
if(content.contains("OK")){
valid = true;
Toast.makeText(getApplicationContext(), "Log In Successful",
Toast.LENGTH_SHORT).show();
}else {
valid = false;
Toast.makeText(getApplicationContext(), "No Access Granted", Toast.LENGTH_SHORT)
.show();
}
updateMenuTitles();
}
}
// open up the login page
final WebView wv = (WebView)findViewById(R.id.login_webview);
wv.getSettings().setJavaScriptEnabled(true);
wv.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
wv.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
//once page is finished loading, check id="role" pass that value to showHTML
if(url.contains(getString(R.string.loginURL))) {
wv.loadUrl("javascript:(function() { " +
"window.HTMLOUT.showHTML(document.getElementById('course-eval-status')" +
".innerHTML);})()");
wv.setVisibility(View.GONE);
closeWebview.setVisibility(View.GONE);
}
}
@Override
public void onReceivedError(WebView view, int errorCode, String description,
String failingUrl) {
Log.w("LoginActivity: ", description);
}
});
wv.loadUrl(getString(R.string.loginURL));
if(!loggedIn) {
wv.setVisibility(View.VISIBLE);
closeWebview.setVisibility(View.VISIBLE);
}else{
closeWebview.setVisibility(View.GONE);
wv.setVisibility(View.GONE);
}
}
答案 0 :(得分:0)
你的问题不明确,但这可能是你想要的吗?
boolean valid = false;
private boolean validate() {
System.out.println("Validating");
return true;
}
public void test() {
if (valid || (valid = validate())) {
System.out.println("Try 1");
}
if (valid || (valid = validate())) {
System.out.println("Try 2");
}
}
这只会拨打validate
一次。但是 - 一个更好的机制就是:
private boolean valid() {
return valid || (valid = validate());
}
public void test2() {
if (valid()) {
System.out.println("Try 1");
}
if (valid()) {
System.out.println("Try 2");
}
}
答案 1 :(得分:0)
如果validate()
更改valid
的值,那么我真的没有办法解决这个问题。在我看来,这个问题并不像商业逻辑那么复杂。你提到你的代码"不会等待" - 你不能改变它让它等待吗?如果没有,那么也许你需要一些单元测试来更好地验证你的代码。无论如何,问题似乎与valid
标志不同。