在android中使用asynctask内部的方法

时间:2013-08-10 06:59:20

标签: android android-asynctask progress-bar

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

我想在登录过程中使用asyntask显示一个progeress栏... 但我不知道在asyntask中使用参数...如果有一个plzz告诉我如何将我的方法放在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()中...

2 个答案:

答案 0 :(得分:0)

进行快速重构(请注意,由于这是非常糟糕的做法和编码,因此您必须重构此代码以使其更具可维护性并避免重复):

public class MyAsyncTask extends AsyncTask<> {

私人活动活动;      布尔结果;      private String myLog;      private String 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();

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

答案 1 :(得分:0)

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