2014-02-19 56 views
1

因此,我有一個登錄屏幕。在按'登錄'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! 
       }});    

下面是從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(); 
} 

對不起,你的傢伙傾倒了這麼多的代碼,但我不認爲一個完整的畫面是可能沒有上述所有。我儘可能地減少了它的尺寸。我最近纔開始使用線程和Android,所以請對我溫柔。

+0

另外,如果你真的必須使用JDBC。 WebService在可靠性,安全性和性能方面是一種更好的方法。 – Behnam

回答

1

根據我的經驗:使用AsyncTask爲JDBC,你不應該折磨。

編輯:

This是實現的AsyncTask整齊爲例:

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.provider.Settings.System; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.view.View.OnClickListener; 

public class AsyncTaskActivity extends Activity implements OnClickListener { 

     Button btn; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     btn = (Button) findViewById(R.id.button1); 
     // because we implement OnClickListener we only have to pass "this" 
     // (much easier) 
     btn.setOnClickListener(this); 
    } 

    public void onClick(View view) { 
     // detect the view that was "clicked" 
     switch (view.getId()) { 
    case R.id.button1: 
     new LongOperation().execute(""); 
     break; 
    } 
} 

private class LongOperation extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     for (int i = 0; i < 5; i++) { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     return "Executed"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     TextView txt = (TextView) findViewById(R.id.output); 
     txt.setText("Executed"); // txt.setText(result); 
     // might want to change "executed" for the returned string passed 
     // into onPostExecute() but that is upto you 
    } 

    @Override 
    protected void onPreExecute() {} 

    @Override 
    protected void onProgressUpdate(Void... values) {} 
    } 
} 

您可能希望創建和處理在 doInBackground您的JDBC連接(字符串... PARAMS)部分你的代碼。

祝你好運。

+0

謝謝,這給我一些閱讀。你能夠添加一些基本的代碼來演示如何使用'AsyncTask'嗎?道歉,如果我要求一點點。 –

+1

@Rudi:當然,請閱讀我的編輯:) – Behnam