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) {}
    }
}