Java Android UI挂起在JDBC连接上——即使连接在另一个线程上
所以,我有一个登录屏幕。按下“登录”Java Android UI挂起在JDBC连接上——即使连接在另一个线程上,java,android,multithreading,jdbc,android-handler,Java,Android,Multithreading,Jdbc,Android Handler,所以,我有一个登录屏幕。按下“登录”按钮后,会建立JDBC连接,检查用户名和密码,如果详细信息正确,则进入下一个活动。因此,UI会挂起大约5秒钟。我假设这是因为连接是在同一个线程中创建的,所以我创建了一个新的连接。然后,我创建了一个处理程序,根据此连接发生的情况与UI进行交互 问题是,UI仍然挂起。下面是在活动中声明新Runnable的位置(h是属于此活动的自定义处理程序引用) 下面是来自LoginProcessorRunnable的run()方法,其中包括导致挂起的代码。MicroManage
按钮后,会建立JDBC连接
,检查用户名和密码,如果详细信息正确,则进入下一个活动
。因此,UI会挂起大约5秒钟。我假设这是因为连接是在同一个线程中创建的,所以我创建了一个新的连接。然后,我创建了一个处理程序
,根据此连接发生的情况与UI进行交互
问题是,UI仍然挂起。下面是在活动中声明新Runnable的位置(h
是属于此活动的自定义处理程序
引用)
下面是来自LoginProcessor
Runnable
的run()方法,其中包括导致挂起的代码。MicroManager
类包含简单的JDBC数据库交互,并建立连接(这里没有什么令人兴奋的东西,我尽量让它尽可能短)
在上面的示例中,没有与UI的直接交互。信息只需发送到处理程序
,以便它可以在UI线程上执行。最后,这里是我的自定义处理程序
名为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使用AsyncTask,你不会再折磨我了
编辑:
是实现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) {}
}
}
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.provider.Settings.System;
导入android.view.view;
导入android.widget.Button;
导入android.widget.TextView;
导入android.view.view.OnClickListener;
公共类AsyncTaskActivity扩展活动实现OnClickListener{
按钮btn;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn=(按钮)findViewById(R.id.button1);
//因为我们实现了OnClickListener,所以我们只需要传递“this”
//(容易多了)
btn.setOnClickListener(此);
}
公共void onClick(视图){
//检测“单击”的视图
开关(view.getId()){
案例R.id.button1:
新建LongOperation()。执行(“”);
打破
}
}
私有类LongOperation扩展了异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
对于(int i=0;i<5;i++){
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
返回“已执行”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
TextView txt=(TextView)findViewById(R.id.output);
txt.setText(“已执行”);//txt.setText(结果);
//可能需要更改传递的返回字符串的“已执行”
//进入onPostExecute(),但这取决于您
}
@凌驾
受保护的void onPreExecute(){}
@凌驾
受保护的void onProgressUpdate(void…值){}
}
}
您可能希望在中创建和处理JDBC连接
doInBackground(字符串…参数)是代码的一部分
祝你好运。谢谢,这给了我一些阅读的时间。您能否添加一些基本代码来演示如何使用AsyncTask
?如果我的要求有点高,请道歉。另外,只有在必要时才使用JDBC。在可靠性、安全性和性能方面,Web服务是一种更好的方法。
@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();
}
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) {}
}
}