Android UI 在 JDBC 连接上挂起 - 即使连接在另一个线程上

Posted

技术标签:

【中文标题】Android UI 在 JDBC 连接上挂起 - 即使连接在另一个线程上【英文标题】:Android UI Hangs on JDBC Connection - Even though Connection is on another Thread 【发布时间】: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 是一种更好的方法。 【参考方案1】:

根据我的经验:对 JDBC 使用 AsyncTask 就不会再受折磨了。

编辑:

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(String... params) 部分代码。

祝你好运。

【讨论】:

谢谢,这让我有一些阅读要做。您能否添加一些基本代码来演示如何使用AsyncTask?如果我要求的有点多,请见谅。

以上是关于Android UI 在 JDBC 连接上挂起 - 即使连接在另一个线程上的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 查询设计在与 SQL Server 的连接上挂起

在 JDBC 连接上切换用户

MySQL JDBC连接上的故障转移?

如何在没有 UI 挂起的情况下将 QtcpSockets 连接到大约 100 个服务器?

如何在flyway创建的postgresql jdbc连接上设置时区?

“NzSQLException:更新计数超过 Integer.MAX_VALUE”错误仅在 JDBC 连接上