【问题标题】:Android - How to make some validations in sequenceAndroid - 如何按顺序进行一些验证
【发布时间】:2011-09-12 16:42:41
【问题描述】:

我需要按顺序进行一些验证,其中一些涉及复杂的数据库操作。

所以,我需要在 UI Thread 的单独线程中执行此操作,好吗? 但是一些验证向用户显示消息,需要确认和 当用户确认时,应该调用下一个验证。

这个代码示例解释了我想要实现的内容:

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? (我不能只创建一个 AsyncTask,因为确认消息会停止流动)。

2 - 为每个验证创建一个 Runnable 并创建线程以在需要调用下一个验证时运行它?

3 - ???


编辑 我测试了这段代码@BinaryBazooka,但不起作用。有什么帮助吗?

公共类 MainActivity 扩展 Activity 实现 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);
        }
    });
}

}

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    我将创建一个新线程并在这些对话框调用期间将其休眠,您可以直接从您的可运行对象中访问 UI。

    runOnUiThread(new Runnable() {                           
    
     public void run() {}
    
    });
    

    有点像..

    Thread someThread = new Thread(new Runnable() { 
    
        @Override
        public void run(){
            runOnUiThread(new Runnable() {                           
                public void run() 
                {
                    AlertDialog.Builder builder = new AlertDialog.Builder(context);                               
                    builder.setMessage(R.string.msg);
                    builder.setPositiveButton(R.string.btn_ok, new  DialogInterface.OnClickListener() {                 
                        @Override
                        public void onClick(DialogInterface dialog, int id) { 
                            dialog.dismiss();
                            someThread.notify();
                        }
                    });
                    AlertDialog alert = builder.create();       
                    alert.show();
                }
            });
        }
        someThread.wait();
    

    【讨论】:

      【解决方案2】:

      适用于 AsyncTask。泰。

      代码:

      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();
          }
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-29
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 2011-12-17
        • 2017-03-07
        • 1970-01-01
        • 2013-11-09
        相关资源
        最近更新 更多