2016-09-26 7 views
0

私のアプリでは、AsyncTask-Aという呼び出しを使用して、新しいユーザーであるかどうかを確認し、AsyncTask-Bを呼び出してユーザーに新しいパスワードの入力を要求してリセットします。ダイアログを表示するにはonPreExecute()を実行してから、KSOAPを使用してパスワードをdoInBackground()に変更してください。しかし、問題は、alert.show();が待たずに、doInBackground()がすぐにロジックを壊すことになるということです。ここでは、コードの関連部分は次のとおりです。Dialog in AsyncTask onPreExecute()

private class AsyncTaskPasswordResetter extends AsyncTask<String, Void, Void> 
{ 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     AlertDialog.Builder builder = new AlertDialog.Builder(login.this); 
     builder.setMessage("Please enter new password"); 
     final EditText input = new EditText(login.this); 
     input.setText(""); 
     builder.setView(input); 

     builder.setPositiveButton("OK", new DialogInterface.OnClickListener() 
       { 
        public void onClick(DialogInterface dialog, int which) 
        { 
         SoapObject request = new SoapObject("http://tempuri.org/", "ChangeParentPassword"); 
         request.addProperty(MyUtils.CreateProp("Username", userName, String.class)); 
         request.addProperty(MyUtils.CreateProp("Password", password, String.class)); 
         SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11) {{dotNet = true;}}; 
         envelope.setOutputSoapObject(request); 
         HttpTransportSE androidHttpTransport = new HttpTransportSE("http://hannuveda.online/default.asmx"); 

         try { 
          androidHttpTransport.call("http://tempuri.org/ChangeParentPassword", envelope); 
          SoapPrimitive response = (SoapPrimitive) envelope.getResponse(); 

          if (response.toString().equals("OK")) { 
           setTextViewstatus("passed\n"); 
          } else { 
           setTextViewstatus("failed\n"); 
           isError = true; 
          } 
         } catch (Exception e) { 
          setTextViewstatus("error\n"); 
          isError = true; 
         } 
        } 
       } 
     ); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
     input.requestFocus(); 
     InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.hideSoftInputFromWindow(input.getWindowToken(), 0); 
    } 

    @Override 
    protected Void doInBackground(String... params) 
    { 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     if(isError) 
      SetLoginButtonEnability(true); 
     setTextViewstatus("wait..."); 
      new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        Intent intent = new Intent(login.this, trackbus.class); 
        intent.putExtra("UserID", userID); 
        startActivity(intent); 
       } 
      }, 1000); 
    } 
} 
+2

AsyncTaskにUIロジックがあるのはなぜですか? UIロジックを外部で行い、コールバックを使用するのはどうでしょうか? –

+0

AsyncTaskAを呼び出して、ユーザーが新規であるかどうかを確認します。ユーザーが新規の場合は、onPostExecute()からAsyncTaskBを呼び出します。 AsyncTaskBでは、(ダイアログを使用して)ユーザーに新しいパスワードを入力する必要があります。あなたが言ったロジックを使ってこれを実装する方法に関するヒント? –

答えて

0

シーケンシャルAsyncTask年代より良好な制御を持っているために、コールバックを使用することをお勧めします。

public class LoginTask extends AsyncTask < String, Void, HttpResponse > { 

private final LoginTaskCallback callback; 

public LoginTask(LoginTaskCallback callback) { 
    this.callback = callback; 
} 


@Override 
protected HttpResponse doInBackground(String...params) { 
    // do network stuff 
} 

@Override 
protected void onPostExecute(HttpResponse response) { 
    // just and example 
    if (response.getStatus() == 200) 
     callback.success(); 
    else 
     callback.failure(); 
} 

public interface LoginTaskCallback { 
    void failure(); 
    void success(); 
} 
} 

その後は、タスクをexecuteとコールバックを受け取るAN AsyncTaskBを開始する。この場合、次のものは何でも行うことができます。

new LoginTask(new LoginTask.LoginTaskCallback() { 
      @Override 
      public void failure() { 
       // stop here smth went wrong 
      } 

      @Override 
      public void success() { 
       // start next task 
      } 
     }).execute(); 
+0

ダイアログボックスはどこに表示されますか? –

+0

@AkshayJ AsyncTaskを呼び出すことができるあなたの 'Activity'またはどこかで。 'username'と' password'をTaskに渡して実行したいだけです。 –

+0

問題は、ユーザーに新しいパスワードを要求し、OKをクリックした後にパスワードを変更する必要があることです。しかし、Show()はブロックしていません。あなたはそれで私を助けることができますか? –

0

1)AsyncTaskからUIコードを削除します。 AsyncTask

 AlertDialog.Builder builder = new AlertDialog.Builder(login.this); 
     builder.setMessage("Please enter new password"); 
     final EditText input = new EditText(login.this); 
     input.setText(""); 
     builder.setView(input); 

     builder.setPositiveButton("OK", new DialogInterface.OnClickListener() 
       { 
        public void onClick(DialogInterface dialog, int which) 
        { 
         //This invocation is explained in details given below 
         new NetworkAsyncTask(ActivityClass.this).execute(); 
        } 
       } 
     ); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
     input.requestFocus(); 
     InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.hideSoftInputFromWindow(input.getWindowToken(), 0); 

にすべきではないネットワークオペレーションの世話をし、呼び出し元のコードの下に

への応答を取得するどのAsyncTaskを呼び出し、ボタンのクリックで)Activity/Fragments
2のものを保管してください別のAsyncTaskを作成してパラメータを取るので、同じものを他のリクエストの処理に使うことができます。

処理されたデータを呼び出し元に返すメソッドを使用してインターフェイスを作成することをお勧めします。

public interface OnAsyncTaskComplition { 
    public void networkResponse(Object responseObject); 

} 

ネットワーク要求が続いて

class DemoActivity extends Activity implements OnAsyncTaskComplition{ 

    @Override 
    public void networkResponse(Object responseObject) { 
    // call back will come here for failure or success 

    } 

} 

に送られ、そこからUIクラスでこのインターフェイスを実装し、ユーザーが新しい場合、この目的のAsyncTaskAで

class NetworkAsyncTask extends AsyncTask<Void,Boolean,Boolean>{ 
     Activity activity; 
     Object responce; 
     ProgressDialog dialog; 
     public NetworkAsyncTask (Activity activity) { 
     super(); 
     this.activity = activity; 
     } 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      //Show a waiting screen 
      dialog = ProgressDialog.show(activity, "Please wait", "Processing........."); 

     } 

     @Override 
     protected Boolean doInBackground(Void... params) { 
     // Do all your processing here 
     //assign the response to OBJECT responce 
     this.responce = processedResult; 
     //return true of false based on the success 
     return true;//or false based on the success 
     } 
     @Override 
     protected void onPostExecute(Boolean aBoolean) { 
      super.onPostExecute(aBoolean); 
      //dismiss the dialog shown for processing 
      if(dialog!=null && dialog.isShowing()) 
       {dialog.dismiss();} 
      activity.networkResponse(responce); 
     } 

} 
+1

。誰もコーダーとして生まれたことはありません!誰もが間違いや試練から学んだ。 Akshay JはAndroidの背景からまったく分かりません。彼の質問から明白です。私たちはそうであり、アイデアやリンクだけではなく、十分なコードで問題が関連している場合に役立ちます。だから私は助けが関係していたと思う。私はあなたの答えに干渉しなかった。私はあなたから同じことを期待しています。 – Stallion

0

ためのAsyncTaskをチェックします、そうであれば、新しいAsyncTaskを実行する代わりにAlertDialogを実行するだけで、ユーザーからデータを取得することができます。
onClickListener AsycnTaskBにパラメータリストとしてユーザデータを渡します。

関連する問題