0

私はasynctaskで進行状況ダイアログを使用したいのですが、それをどのように使用できますか.試してみましたが、応答を取得した後にダイアログが表示されました.このAppResponse = reqClient.execute().get(); この非同期タスクからも戻り値を取得する必要があるため、両方のファイルを参照してください。

 void postHttpRequest(String userId,String pass,TextView error){
            RequestClient reqClient = new RequestClient(IweenTravelLoginPage.this);
            String AppResponse = null;
            try {
                url = "";
                Log.d("Http Post URL is ", url);
                AppResponse = reqClient.execute().get();

                String status = ValidateLoginStatus.checkLoginStatus(AppResponse);
                Log.d("Status recived", status);

                if(status.equals("200")){
                    saveInformation(userId,pass);
                    startingActivity();
                }else{
                    error.setText("Incorrect UserName or Password");
                }
            } catch (Exception e) {
                Log.e("Exception Occured", "Exception is "+e.getMessage());
            }

この関数はリクエストを送信するためのものです

public class RequestClient extends AsyncTask<String, Void, String>{
    Context context;

    public RequestClient(Context c) {
        context = c;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... aurl){
    String responseString="";
    HttpClient client = null;
    try {
         client = new DefaultHttpClient();  
         HttpGet get = new HttpGet(IweenTravelLoginPage.url);
         HttpResponse responseGet = client.execute(get);  
         HttpEntity resEntityGet = responseGet.getEntity();  
         if (resEntityGet != null) {  
             responseString = EntityUtils.toString(resEntityGet);
             Log.i("GET RESPONSE", responseString.trim());
         }
    } catch (Exception e) {
        Log.d("ANDRO_ASYNC_ERROR", "Error is "+e.toString());
    }
        Log.d("ANDRO_ASYNC_RESPONSE", responseString.trim());
        client.getConnectionManager().shutdown();
     return responseString.trim();

    }


    @Override
    protected void onPostExecute(String response) {
         super.onPostExecute(response); 
        }
}

プロセスダイアログを表示するために私がしなければならないことを教えてください.スタックオーバーフローですべての例を試しました.

4

5 に答える 5

1

以前の回答に基づいて構築するだけで、リスナー関数を変更して戻りデータであるパラメーターを取り込むことにより、非同期タスクから返されたデータを取得できます

public interface OnTaskCompleted{
    void onTaskCompleted(String response);
}

次に、非同期タスクの postExecute 関数で、戻りデータを使用してリスナーを呼び出します。

    @Override
    protected void onPostExecute(String response){
        //your stuff
        listener.onTaskCompleted(response);
    }

次に、Async タスクを呼び出す場所で、リスナーを実装するだけです。クラスにリスナーを実装させるか、匿名クラスを使用することができます

OnTaskCompleted listener = new OnTaskCompleted() {
    void onTaskCompleted(String response){
        // We got return data from the Async Task, do stuff!
    }
};
RequestClient reqClient = new RequestClient(listener);
reqClient.execute();

進行状況ダイアログを表示するには、非同期タスクを呼び出す前に表示するように設定する必要があります。その後、Aysnc タスクからコールバックを受信したら、それを閉じることができます。

//make progressDialog a member of your class
progressDialog = new ProgressDialog(IweenTravelLoginPage.this);
progressDialog.setMessage("Loading");
progressDialog.show();

OnTaskCompleted listener = new OnTaskCompleted() {
    void onTaskCompleted(String response){
        // get rid of the progress dialog
        progressDialog.dismiss;
        // We got return data from the Async Task, do stuff!
    }
};
RequestClient reqClient = new RequestClient(listener);
reqClient.execute();
于 2013-07-23T11:34:26.367 に答える
1

この方法を使用すると、これは私にとって完璧に機能します

インターフェイスを作成し、それをAsyncTask(コンストラクターで)に渡し、次にメソッドを呼び出すことができますonPostExecute

例えば:

あなたのインターフェース:

public interface OnTaskCompleted{
    void onTaskCompleted();
}

あなたの活動:

public YourActivity implements OnTaskCompleted{
    //your Activity
}

そしてあなたの AsyncTask:

public YourTask extends AsyncTask<Object,Object,Object>{ //change Object to required type
    private OnTaskCompleted listener;

    public YourTask(OnTaskCompleted listener){
        this.listener=listener;
    }

    //required methods

    protected void onPostExecute(Object o){
        //your stuff
        listener.onTaskCompleted();
    }
}

これを決して呼び出さないでAppResponse = reqClient.execute().get();ください。これはあなたのuithreadをブロックします

于 2013-07-23T07:32:31.627 に答える
1

あなたはこれを試すことができます

extends AsyncTask<String, Void, String>{
Context context;

public RequestClient(Context c) {
    context = c;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
    progressDialog = new ProgressDialog(context);
    progressDialog.setMessage("Loading. Please Wait");
    progressDialog.setIndeterminate(false);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    progressDialog.setCancelable(true);
    progressDialog.show();
}

@Override
protected String doInBackground(String... aurl){
String responseString="";
HttpClient client = null;
try {
     client = new DefaultHttpClient();  
     HttpGet get = new HttpGet(IweenTravelLoginPage.url);
     HttpResponse responseGet = client.execute(get);  
     HttpEntity resEntityGet = responseGet.getEntity();  
     if (resEntityGet != null) {  
         responseString = EntityUtils.toString(resEntityGet);
         Log.i("GET RESPONSE", responseString.trim());
     }
} catch (Exception e) {
    Log.d("ANDRO_ASYNC_ERROR", "Error is "+e.toString());
}
    Log.d("ANDRO_ASYNC_RESPONSE", responseString.trim());
    client.getConnectionManager().shutdown();
 return responseString.trim();

}


@Override
protected void onPostExecute(String response) {
     super.onPostExecute(response); 
     progressDialog.dismiss();
        }
}
于 2013-07-23T07:32:54.257 に答える
0

この目的のために、asyncTask で onProgressUpdate() を使用できます。これは、doInBackground() から showProgressUpdate() を実行するたびに呼び出されます。

于 2013-07-23T07:24:40.850 に答える