【发布时间】:2014-02-19 14:12:40
【问题描述】:
所以,我有一个登录屏幕。按下“登录”Button 后,JDBC Connection 会检查用户名和密码,如果详细信息正确,则转到下一个Activity。因此,UI 会挂起大约 5 秒。我认为这是因为连接是在同一个Thread 中创建的,所以我创建了一个新的。然后,我创建了一个 Handler 来与 UI 进行交互,具体取决于此连接发生的情况。
问题是,UI 仍然挂起。下面是在 Activity 中声明新 Runnable 的位置(h 是属于此 Activity 的自定义 Handler 引用);
logInButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
progress.setVisibility(ProgressBar.VISIBLE);
new LoginProcessor(h).run(); // HERE!
}});
下面是来自LoginProcessorRunnable 的run() 方法,其中包括导致挂起的代码。 MicroManager 类包含简单的 JDBC 数据库交互并建立连接(那里真的没有什么令人兴奋的,我尽量保持简短);
public void run() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
try{
MicroManager manager = new MicroManager(); // THIS LINE, AND THE LINE BELOW, ARE CAUSING THE HANG!!!!
if(manager.getEmployeeId(h.getLoginName(), h.getPassword())!= 0){
h.sendEmptyMessage(0);
}
}catch(Exception ex){
ex.printStackTrace();
h.sendEmptyMessage(1);
}
}
在上面,没有与 UI 的直接交互。信息被简单地发送到Handler,以便它可以在 UI 线程上执行。最后,这里是我自定义的Handler的方法,叫做LogInHandler;
@Override
public void handleMessage(Message msg){
if(msg.what == 0){
activity.startActivity(new Intent(activity, AdvisorsPanelActivity.class));
activity.finish();
}else{
AlertDialog alertDialog = new AlertDialog.Builder(activity).create();
alertDialog.setTitle("Not Working");
alertDialog.show();
activity.setProgressVisible(ProgressBar.GONE);
}
}
public String getLoginName(){
return activity.getLoginName();
}
public String getPassword(){
return activity.getPassword();
}
很抱歉把这么多代码扔给你们,但我认为没有上述所有内容就不可能有完整的画面。我已经尽可能地削减了它。我最近才开始使用 Threading 和 Android,所以请对我温柔一点。
【问题讨论】:
-
另外,如果你真的需要,只使用 JDBC。在可靠性、安全性和性能方面,WebService 是一种更好的方法。
标签: java android multithreading jdbc android-handler