Android - 如何按顺序进行一些验证

时间:2011-09-12 16:42:42

标签: android android-asynctask

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

所以,我需要在一个独立的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? (我不能只创建一个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);
        }
    });
}

}

2 个答案:

答案 0 :(得分:0)

我会创建一个新线程并在这些对话调用期间休眠,您可以直接从runnable中访问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();

答案 1 :(得分: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();
    }
}

}