Android AsyncTask助手类

时间:2012-12-07 14:02:36

标签: android android-asynctask

我目前有一个UserFunctions类可以执行我的所有用户操作,例如注册,登录等。在UserFunctions类中,有一个JSONParser对象,它执行所有实际的HTTP调用并返回JSONObject。

public class UserFunctions {

    private JSONParser jsonParser;

    private static String registerURL = Constants.registerUrl;

    // constructor
    public UserFunctions(){
        jsonParser = new JSONParser();
    }

    public JSONObject register(){
        // getting JSON Object
        JSONObject json = jsonParser.getJSONFromUrl(registerURL);
        // return json
        return json;
    }
...
}

然后在我的活动类的事件处理程序中,我只做UserFunctions.register()。

我的问题是,我现在想在后台线程中执行所有这些调用,同时显示ProgressDialog。我知道在后台运行线程是通过AsyncTask实现的。

但是我应该如何实现这个设计,以便我仍然可以在我的Activity类中执行UserFunctions.register(),所有操作都在后台线程和progressDialog中完成。

4 个答案:

答案 0 :(得分:1)

这对你有帮助吗?

@Override
public void onCreate(Bundle savedInstanceState) {
     new MyAsyncTask(this).execute();
}

privateclass MyAsyncTask extends AsyncTask<String, Void, Boolean> {
    private ProgressDialog dialog;
    private Context context;

    public ProgressTask(Context context) {
        this.context= context;
        dialog = new ProgressDialog(context);
    }

    protected void onPreExecute() {
        this.dialog.setMessage("Progress start");
        this.dialog.show();
    }

    protected void onPostExecute(final Boolean success) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        }
    }

    protected Boolean doInBackground(final String... args) {
        // do you registering or whether here
        // in this model you can return a boolean to the PostExecute.
    }

}

答案 1 :(得分:1)

执行以下操作:

1)在活动类中声明对话框,如下所示:

ProgressDialog dialog;

2)然后声明AsyncTask如下:

private class RegisterUser extends AsyncTask<String,Integer,String>{
            String nessage="";
            @Override
            protected void onPreExecute(){
                dialog = ProgressDialog.show(context, "Registering user",
                            "Please wait.....");
            }

            @Override
            protected String doInBackground(String... params) {
                // provide yourcode to register the user then return message
                      return message="you are registered";
            }

            protected void onPostExecute(String result) {
                dialog.dismiss();
                            if (result.equlas("you are resgisted"))
                             // optinal if you want to do as below
                             // do something here showing toast or any thing of your prefreance  

            }
         }

答案 2 :(得分:1)

好的,进度对话框和异步任务分为两部分,您需要将JSONparser移动到实际的异步任务中。如果要使用多个进度对话框,只需在调用asynctask之前调用它们,并在返回时关闭它们

private class JsonRetriever extends AsyncTask<Url, Void, JSONObject>{
            private JSONParser jsonParser;
            private ProgressDialog dialog;

    public JsonRetriever(Context c){
        dialog= new ProgressDialog(c);
        jsonParser= new JSONParser();
    }
    protected void onPreExecute() {
          dialog.setMessage("Starting retrieval");
          dialog.show();
    }
    protected JSONObject doInBackground(Url... params) {
         try{
            return jsonParser.getJSONFromUrl(params[0]);
        }catch(Exception e){
            return false;
        }
        return true;
    }
    protected void onPostExecute(final JSONObject success) {
             if (dialog.isShowing()) {
                     dialog.dismiss();
            }
      }
}

然后打电话给这只做

public JSONObject register(){
    return new JSONRetriever(this).execute(registerURL).get();
}

答案 3 :(得分:0)

AsyncTask-Class查看publishProgress(),我认为您正在寻找它。

当Background-Thread完成一些工作时,此方法用于更新UI。您可以在doInBackground() - 方法。

中随时调用它