2011-09-12 3 views
1

いくつかのバリデーションを順次実行する必要があり、その中には複雑なデータベース操作が必要なものがあります。Android - シーケンスでいくつかのバリデーションを行う方法

だから、私はUIスレッドの分離スレッドでこれを行う必要がありますか? しかし、いくつかの妥当性検査は、ユーザーに確認メッセージが表示され、確認が必要な場合は と表示されます。

このコード例は、私が実装したいものを説明します

void makeValidation1(){ 

    if(condition1Valid()){ 
     makeValidation2(); 

    }else{ 
     DialogInterface.OnClickListener onClick = new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       makeValidation2(); 
      } 
     }; 

     AlertDialog.Builder builder = new AlertDialog.Builder(this) 
     .setMessage("really want to do this?") 
     .setPositiveButton("Yes", onClick); 

     builder.create().show(); 
    } 
} 

void makeValidation2(){ 

    if(condition2Valid()){ 
    }else{ 
     //... 
    } 
} 

boolean condition1Valid() { 
    // complex database Operations 
    return false; 
} 
boolean condition2Valid() { 
    //complex database Operations 
    return false; 
} 

    //... 


    void makeValidation9(){ 
     //... 
    } 

私の質問は:最良の方法/パターンはこれを実装するためには何?

1 - 検証ごとにasyncTaskを1つ作成しますか? (確認メッセージは磁束を止めることができるので、私はただ1つのAsyncTaskを作成することはできません)。

2 - 検証ごとにRunnableを作成し、次の検証を呼び出す必要があるときに実行するスレッドを作成しますか?

3 - ???


編集 私はこのコード@BinaryBazookaが、イマイチの作業をテストしました。どんな助け?

パブリッククラスMainActivityアクティビティがOnClickListener {

Thread mThread; 
ProgressDialog mProgressDialog; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Button button = new Button(this); 
    button.setText("Start"); 
    setContentView(button, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 
    button.setOnClickListener(this); 

} 

@Override 
public void onClick(View v) { 
    mThread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      validations(); 
     } 
    }); 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage("Start Thread?"); 
    builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 

      mProgressDialog = new ProgressDialog(MainActivity.this); 
      mProgressDialog.show(); 

      mThread.run(); 
     } 
    }); 

    builder.create().show(); 
} 

void validations(){ 
    //this method go on separated thread 
    validation1(); 

    validation2(); 

    validation3(); 
} 

void validation1(){ 

    if(true){ 
     final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 

     builder.setMessage("Validation 1 failed. Go validation 2?"); 

     builder.setPositiveButton("Go", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.dismiss(); 
       mProgressDialog.show(); 
       //if user confirm, continue validation thread 
       mThread.notify(); 
      } 
     }); 
     builder.setOnCancelListener(new OnCancelListener() { 

      @Override 
      public void onCancel(DialogInterface dialog) { 
       //if user cancel, stop validation thread 
       mThread.interrupt(); 
      } 
     }); 

     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       mProgressDialog.hide(); 
       builder.create().show(); 
      } 
     }); 

     try { 
      synchronized (mThread) { 
       //wait for user confirmation 
       mThread.wait(); 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

private void validation2() { 

    if(true){ 
     final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 

     builder.setMessage("validacao 2 failed. Go validation 3?"); 
     builder.setPositiveButton("Go", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.dismiss(); 
       mProgressDialog.show(); 
       mThread.notify(); 
      } 
     }); 
     builder.setOnCancelListener(new OnCancelListener() { 

      @Override 
      public void onCancel(DialogInterface dialog) { 
       mThread.interrupt(); 
      } 
     }); 

     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       mProgressDialog.hide(); 
       builder.create().show(); 
      } 
     }); 

     try { 
      synchronized (mThread) { 
       mThread.wait(); 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

private void validation3() { 
    Log.i("TAG", "<<<<<<<<<< >>>>>>>>>>>>"); 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      Toast.makeText(MainActivity.this, "finished", Toast.LENGTH_SHORT); 
     } 
    }); 
} 

}

答えて

0

を実装して拡張し、私は新しいスレッドを作成して、これらのダイアログの呼び出し中にそれを眠る、あなたがあなたの実行可能内から直接UIにアクセスすることができます。 。

runOnUiThread(new Runnable() {       

public void run() {} 

}); 

..だから

0123のようなもの
+0

のTy。あなたのアイデアは役に立ちました – Rodrigo

0

AsyncTaskで動作します。 Ty。

コード:

public class MainActivity extends Activity implements OnClickListener { 

//Thread mThread; 
ProgressDialog mProgressDialog; 
private ValidationsAsyncTask async; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Button button = new Button(this); 
    button.setText("Start"); 
    setContentView(button, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 
    button.setOnClickListener(this); 

} 

@Override 
public void onClick(View v) { 


    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage("Start Thread?"); 
    builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 


     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 

      mProgressDialog = new ProgressDialog(MainActivity.this); 
      mProgressDialog.show(); 

      async = new ValidationsAsyncTask(); 
      async.execute(); 
     } 
    }); 

    builder.create().show(); 
} 

void validation1(){ 

    if(true){ 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 

       builder.setMessage("Validation 1 failed. Go validation 2?"); 

       builder.setPositiveButton("Go", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
         mProgressDialog.show(); 

         //if user confirm, continue validation thread 
         synchronized (async) { 
          async.notify(); 
         } 
        } 
       }); 
       builder.setOnCancelListener(new OnCancelListener() { 

        @Override 
        public void onCancel(DialogInterface dialog) { 
         //if user cancel, stop validation thread 
         async.cancel(true); 
        } 
       }); 
       mProgressDialog.hide(); 
       builder.create().show(); 
      } 
     }); 

     Log.i("TAG - validation1", Thread.currentThread().getName()); 

     try { 
      synchronized (async) { 
       //wait for user confirmation 
       async.wait(); 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

private void validation2() { 

    if(true){ 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 

       builder.setMessage("validacao 2 failed. Go validation 3?"); 
       builder.setPositiveButton("Go", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
         mProgressDialog.show(); 
         synchronized (async) { 
          async.notify(); 
         } 
        } 
       }); 
       builder.setOnCancelListener(new OnCancelListener() { 

        @Override 
        public void onCancel(DialogInterface dialog) { 
         async.cancel(true); 
        } 
       }); 

       mProgressDialog.hide(); 
       builder.create().show(); 
      } 
     }); 

     try { 
      synchronized (async) { 
       async.wait(); 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

private void validation3() { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      mProgressDialog.dismiss(); 
      Toast.makeText(MainActivity.this, "finished", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

class ValidationsAsyncTask extends AsyncTask<Void, Void, Void>{ 

    @Override 
    protected Void doInBackground(Void... params) { 
     validation1(); 

     validation2(); 

     validation3(); 

     return null; 
    } 

    @Override 
    protected void onCancelled() { 
     Toast.makeText(MainActivity.this, "cancelled", Toast.LENGTH_LONG).show(); 
    } 
} 

}

関連する問題