0

我目前有一个 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

4 回答 4

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.
    }

}
于 2012-12-07T14:13:17.703 回答
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  

            }
         }
于 2012-12-07T14:14:58.673 回答
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();
}
于 2012-12-07T14:19:59.123 回答
0

publishProgress()AsyncTask-Class看一下,我认为它是您正在寻找的。

此方法用于在 Background-Thread 完成某些工作时更新 UI。您可以随时在doInBackground()-Method 中调用它。

于 2012-12-07T14:18:59.587 回答