Как отобразить диалоговое окно Progress для Android Robotium Test: - PullRequest
1 голос
/ 30 марта 2012

Основной класс:

public class ProgressIndicator {
    static ProgressIndicator instance;
    Context context;
    public static ProgressIndicator getInstance() {

        if (instance == null) {
            instance = new ProgressIndicator();
        }
        return instance;
    }

    private ProgressIndicator() {

    }
    IndicatorThread sd;
    public void showIndicator(Activity activity, String title, String message, boolean flag) {
        sd = new IndicatorThread(activity, title, message, flag);
        sd.start();
    }

    public void dismissIndicator(Activity activity) throws InterruptedException{
        sd.dismiss();
        // sd.join();
    }

    private static class IndicatorThread extends Thread {

        private static final Message listener = null;
        private static String mTitle;
        private static String mText;
        private Activity mActivity;
        private boolean mflag;
        private ProgressDialog mDialog;

        protected boolean dismiss;

        IndicatorThread(Activity activity, String title, String text, boolean flag) {
            super();
            IndicatorThread.mText = text;
            IndicatorThread.mTitle = title;
            this.mActivity = activity;
            this.mflag = flag;
            if (mDialog == null) {
                mDialog = new ProgressDialog(mActivity);
                mDialog.setTitle(mTitle);
                mDialog.setMessage(mText);              
                mDialog.setIndeterminate(true);
                mDialog.setCancelable(true);
                mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

                if(mflag == true){
                    mDialog.setButton("Cancel", listener);
                    mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                        @Override
                        public void onCancel(DialogInterface arg0) {
                            mDialog.dismiss();
                            interrupt();
                        }
                    });
                }
            }
            mDialog.show();
            mDialog.getWindow().setLayout(160, 350);
            mDialog.getWindow().setGravity(0);
        }

        public void dismiss() {
            dismiss = true;
            mDialog.dismiss();
            System.out.println("notifying..."+dismiss);
            synchronized (this) {
                notifyAll();
            }
        }

        @Override
        public void run() {
            System.out.println("Running..."+dismiss);

            while (!dismiss) {
                System.out.println("waiting..."+!dismiss);

                synchronized (this) {
                    try {
                        wait();
                    } catch (InterruptedException ie) {
                        ie.printStackTrace();
                    }
                }
            }
            System.out.println("Quitting...");
        }
    }
}

Вызов из класса AppController:

private ProgressIndicator progressInstance = null;
public void showWaitingAnimation(Activity parent) {
    progressInstance.showIndicator(AppController.getInstance().currentActivity, "" , "", false);
}

Класс испытаний:

public class ProgressIndicatorTest extends
    ActivityInstrumentationTestCase2<MyTestActivity> {

    private Solo solo;

    private ProgressIndicator progressIndicatorInstance;

    public ProgressIndicatorTest() {
        super("com.test.activity",
                MyTestActivity.class);
    }

    protected void setUp() throws Exception {
        AppController.getInstance().startApp(getActivity());
        solo = new Solo(getInstrumentation(), getActivity());
        progressIndicatorInstance = ProgressIndicator.getInstance();
    }

    protected void tearDown() throws Exception {
        try {
            solo.finalize();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        getActivity().finish();
        super.tearDown();
    }

    public void testGetInstance() {
        try {
            ProgressIndicator instance = ProgressIndicator.getInstance();
            assertNotNull(instance);
        } catch (Exception e) {
            fail("Creation of ExceptionDetails get instance failed!");
        }
    }

    public void testShowIndicator()  {
        Log.d("testCase Name:-", "testShowIndicator");

        ProgressIndicator progressInstance = ProgressIndicator.getInstance() ;
        progressInstance.showIndicator(AppController.getInstance().getCurrentActivity(), "" , "", false);
        //AppController.getInstance().showWaitingAnimation(AppController.getInstance().getCurrentActivity());
            solo.waitForDialogToClose(8000);
        try {
            progressInstance.dismissIndicator(AppController.getInstance().getCurrentActivity());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void testDismissIndicator() {
        Log.d("testCase Name:-", "testDismissIndicator");
        ProgressIndicator progressInstance = ProgressIndicator.getInstance() ;
        progressInstance.showIndicator(AppController.getInstance().getCurrentActivity(), "" , "", false);
        solo.waitForDialogToClose(2000);
        try {
            progressInstance.dismissIndicator(AppController.getInstance().getCurrentActivity());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //AppController.getInstance().showAppTerminationDialog("", AppController.getInstance().getCurrentActivity());
    }
}

Во время работы проекта диалоговое окно отображается и работает правильно. Но при выполнении тестового примера виден только черный экран, диалоговое окно не отображается (после использования solo.waitForDialogToClose (8000); проблема есть) Никаких ошибок или исключений не выдается, и тестовые случаи проходят в тесте Android Junit. Если у кого-то есть идеи, как отобразить это диалоговое окно прогресса в случае тестирования robotium, поделитесь.

1 Ответ

1 голос
/ 17 апреля 2012

В моем случае я могу успешно отображать диалоги прогресса. Я просто использовал

boolean showProgressBar = false;
showProgressBar = solo.waitForText("Verifying and Saving Credentials...", 1, 3000);

Я надеюсь, что это также должно работать для вас ..:)

...