0

我创建了一个简单的登录应用程序,它从 sqlserver 获取用户名和密码。它工作正常...

我想在登录过程中使用 asyntask 显示一个进度条...但我不知道在 asyntask 中使用参数...如果有人告诉我如何将我的方法放在 asyntask 的 doInbackground 中以及我应该使用什么参数。 ...

我的代码是;......

public void save(){
    initilize();
    ResultSet rs = null;
    String mylog=id.getText().toString();
    String mypass=pass.getText().toString();
    try{
    Statement statement=connect.createStatement();
    rs=statement.executeQuery("LOGIN '"+mylog+"', '"+mypass+"'");
    }catch(Exception e){
        e.printStackTrace();
    }

    if(mylog.equals("")||mypass.equals("")){

        Toast.makeText(getApplicationContext(), "empty fields", Toast.LENGTH_SHORT).show();

    } else
        try {
            if(rs.next()){

                Intent i=new Intent(getApplicationContext(),Act2.class);
                startActivity(i);
            }
            else if(rs.next()==false){

                Toast.makeText(getApplicationContext(), "incorrect login", Toast.LENGTH_SHORT).show();
                id.setText("");
                pass.setText("");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

如果可以将相同的方法 save() 保存在 asyntask 的 doInbackground() 中...

4

2 回答 2

0

进行快速重构(请注意,就目前而言,这是非常糟糕的实践和编码,您必须重构此代码以使其更易于维护并避免重复):

public class MyAsyncTask extends AsyncTask<> {

私人活动活动;布尔结果;私人字符串 myLog; 私人字符串 myPass;私人连接连接;

public MyAsyncTask(Activity activity, Connection connect) {
    this.activity = activity;
    this.connect = connect;
}

@Override
protected void onPreExecute() {
    //show your progress dialog
}

@Override
protected Object doInBackground(Object[] objects) {

    ResultSet rs = null;
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                initilize();
                mylog=id.getText().toString();
                mypass=pass.getText().toString();
            }
        });

        try{
            Statement statement=connect.createStatement();
            rs=statement.executeQuery("LOGIN '"+mylog+"', '"+mypass+"'");
        }catch(Exception e){
            e.printStackTrace();
        }

        if(mylog.equals("")||mypass.equals("")){
            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(activity.getApplicationContext(), "empty fields", Toast.LENGTH_SHORT).show();
                }
            });


        } else
            try {
                if(rs.next()){
                result = true;

                }
                else if(rs.next()==false){

                    activity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(activity.getApplicationContext(), "incorrect login", Toast.LENGTH_SHORT).show();
                            id.setText("");
                            pass.setText("");
                        }
                    });

                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    return null;
}

@Override
protected void onPostExecute(Object o) {
    //hide your progress dialog
    if(result == Boolean.TRUE){
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Intent i=new Intent(activity.getApplicationContext(),Act2.class);
                activity.startActivity(i);
            }
        });

    }

}
}

然后在您的活动中执行以下操作:

MyAsyncTask a = new MyAsyncTask(this, connect); //im guessing "connect" is your Connection object
a.execute();

正如我所说,我对代码进行了快速重构,但这里没有考虑最佳实践和良好实现。

于 2013-08-10T07:36:38.930 回答
0

也许,您可以使用计时器来检查您的登录是否准备好。只要不是,你就显示你的进度条。如果它准备好了,你可以关闭酒吧并开始一个新的活动或任何事情。计时器运行可以在 u UI 线程上运行。问候 :)

于 2013-08-10T08:35:29.337 回答