0

現在、登録、ログインなど、すべてのユーザーアクションを実行するUserFunctionsクラスがあります。UserFunctionsクラスには、実際のすべてのHTTP呼び出しを実行してJSONObjectを返すJSONParserオブジェクトがあります。

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

これには、進行状況ダイアログと非同期タスクの 2 つの部分があります。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

AsyncTask-ClasspublishProgress()から見てください。あなたが探しているものだと思います。

このメソッドは、Background-Threadが何らかの作業を行ったときにUIを更新するために使用されます。doInBackground()-Methodでいつでも呼び出すことができます。

于 2012-12-07T14:18:59.587 に答える