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!
);
下面是来自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();
很抱歉把这么多代码扔给你们,但我认为没有上述所有内容就不可能有完整的画面。我已经尽可能地削减了它。我最近才开始使用 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 的连接上挂起
如何在没有 UI 挂起的情况下将 QtcpSockets 连接到大约 100 个服务器?