我正在编写一个需要用户登录的Android应用程序。我有一个“用户名”和“密码”EditText字段以及一个“提交”按钮。
在模拟器(和手机)上进行测试时,当用户点击“提交”时,该应用似乎会“锁定”。它实际上没有崩溃或类似的东西,只是在与服务器的连接被锁定时(如果登录正确,它会将用户推进到下一个视图)。
这不是很美观,因为一些用户可能认为如果他们的连接速度很慢并且登录过程没有处理几秒钟,应用程序已经锁定..
为了避免这种情况,我希望有一个ProgressBar,它只是为了让用户知道正在发生的事情并且应用还没有锁定!
这是我的代码:
private OnClickListener listenerOne = new OnClickListener() {
public void onClick(View v) {
Button submitButton = (Button)findViewById(R.id.submit);
submitButton.setVisibility(8); //Make submit button invisible
ProgressBar progressBar = (ProgressBar)findViewById(R.id.progressbar);
progressBar.setVisibility(0); //Make progress bar visible. It's in the same position as the submit button
login(); // do the login server stuff
// the problem is that thenew visibility doesn't happen until the login() is called...
}
};
我已经订购了代码,以便它使提交不可见,然后使进度条可见,然后进行登录(因此当应用程序连接到登录服务器时,进度条会在那里旋转)。但是,它没有弄清楚我的意图 - 它似乎正在跳过setVisibility代码并只是调用login方法。它必须设置提交和进度条项目的可见性,但它不会在登录方法执行其中之前发生,因为它只是像往常一样锁定并且项目从未实际隐藏/显示,直到登录方法完成!!
非常感谢任何帮助。对不起,请写文章!
答案 0 :(得分:1)
在更改ProgressBar可见性之后,您需要将控制权交还给UI线程,并在另一个线程上执行登录工作。最好的方法是通过AsyncTask。
This answer有一个代码示例,用于在后台执行任务时显示ProgressDialog。您可以修改它以改为在ProgressBar上调用setVisibility
。
答案 1 :(得分:0)
登录部分仍在接管UI线程,尽管它位于你的UI元素之后。
您应该尝试在单独的线程或AsyncTask中运行它。首先尝试使用此功能(用它替换你的login()
来电),然后使其更漂亮:
new Thread(new Runnable() {
public void run() {
login();
}
}).start();
您使用实际的整数而不是可用于设置可见性的标志的任何特殊原因?看起来像这样更容易阅读:
progressBar.setVisibility(ProgressBar.VISIBLE);