Android - Как сделать несколько проверок в последовательности - PullRequest
1 голос
/ 12 сентября 2011

Мне нужно выполнить некоторые проверки последовательно, и некоторые из них включают сложные операции с базой данных.

Итак, мне нужно сделать это в отдельном потоке пользовательского интерфейса, хорошо?Но некоторые проверки показывают сообщения пользователю, что нужно подтверждение, и когда пользователь подтверждает, следующая проверка должна быть вызвана.

Этот пример кода объясняет, что я хочу реализовать:

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 -???


edit Я тестировал этот код @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 голосов
/ 13 сентября 2011

Работает с 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();
    }
}

}

0 голосов
/ 13 сентября 2011

Я хотел бы создать новый поток и перевести его в спящий режим во время этих диалоговых вызовов, вы можете получить доступ к пользовательскому интерфейсу непосредственно из своего запускаемого файла с помощью ..

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...