因此,我有一個登錄屏幕。在按'登錄'Button
時,JDBC Connection
用於檢查用戶名和密碼,然後在詳細信息正確的情況下轉到下一個Activity
。因此,UI會掛起大約5秒鐘。我認爲這是因爲連接創建在同一Thread
,所以我創建了一個新的。然後,我創建了一個Handler
以與UI進行交互,具體取決於此連接發生的情況。Android UI掛在JDBC連接上 - 儘管連接在另一個線程上
問題是,用戶界面仍然掛起。以下是活動中聲明新的Runnable的位置(h
是屬於此Activity
的自定義Handler
參考);
logInButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
progress.setVisibility(ProgressBar.VISIBLE);
new LoginProcessor(h).run(); // HERE!
}});
下面是從LoginProcessor
Runnable
其包括導致掛起代碼中的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();
}
對不起,你的傢伙傾倒了這麼多的代碼,但我不認爲一個完整的畫面是可能沒有上述所有。我儘可能地減少了它的尺寸。我最近纔開始使用線程和Android,所以請對我溫柔。
另外,如果你真的必須使用JDBC。 WebService在可靠性,安全性和性能方面是一種更好的方法。 – Behnam