2

バックエンドWebサービスと通信するAndrodアプリケーションがあります。テストの一環として、送信ボタンが押されたときのクライアント側の遅延の長さをシミュレートする必要があります。

現在、送信ボタンにOnClickListenerでThread.sleep()を使用していますが、このようにUIスレッドをスリープすると、アプリが完全に「フリーズ」したように見えるという意図しない結果が発生します。ボタンはスレッドまで強調表示されたままになります。ウェイクアップすると、ProgressBarも同様に完全にフリーズします。これが私のコードです:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_checkout);

    pBar = (ProgressBar) findViewById(R.id.progressBar1);
    pBar.setVisibility(View.INVISIBLE);

    Button submitButton = (Button) findViewById(R.id.btnSubmit);
    submitButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            pBar.setVisibility(View.VISIBLE);
            try {
                Thread.sleep(3000); //eventually this delay will be random
                                    //right now it obviously hangs the UI
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            performMyAppSpecificWorkHere();
            pBar.setVisibility(View.INVISIBLE);
            CheckoutActivity.this.finish();
        }
    });  
}

UI全体をぶら下げることなく遅延をシミュレートできる方法を探しています。どんなアイデアでも大歓迎です。ありがとう!

編集

ここでいくつかの説明!私がする必要があることの一部は、遅延をシミュレートし、ユーザーインターフェイスがそれをきれいに処理できるようにすることです(これは現在起こっていないことです)。

つまり...クライアントまたはWebサービスのいずれかに遅延がある場合、クライアントは待機中にスピナーを回転させることによってそれを処理する必要があります。バックエンドの遅延をシミュレートする機能はすでに実行されており、希望どおりに機能しますが、UIスレッドをハングさせずに、クライアントで遅延をシミュレートしたいと思います。

4

3 に答える 3

4

さあ行こう:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_checkout);

    pBar = (ProgressBar) findViewById(R.id.progressBar1);
    pBar.setVisibility(View.INVISIBLE);

    Button submitButton = (Button) findViewById(R.id.btnSubmit);
    submitButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            Thread t=new Thread(new Runnable(){
               @Override
               public void run(){
                 try {
                  Thread.sleep(3000);
                 } catch (InterruptedException e) {
                   e.printStackTrace();
                 }
                 performMyAppSpecificWorkHere();
                 runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        pBar.setVisibility(View.INVISIBLE);
                        CheckoutActivity.this.finish();
                    }
                 }
               }
            });
            pBar.setVisibility(View.VISIBLE);
            t.start();
        }
    });  
}

したがって、onClickイベントで新しいスレッドを開始しています。この新しいスレッドは、3秒間スリープした後、アプリケーションの作業を実行する必要があります。その後、いくつかのUIオブジェクトを更新する必要がありますが、UIスレッドではないスレッド内からは更新できません。そのため、作業の実行後にrunOnUiThread(..)があります。それが役に立てば幸い!

于 2012-10-16T14:49:45.120 に答える
3

まず、メインスレッド(uiスレッド)をブロックしないでください。ブロックしないと、GUIがフリーズします。代わりに、を使用して、内部にAsyncTask配置し、Thread.sleep(3000)内部doInBackground()でやりたいことを実行しますonPostExecute()onPostExecute()メインスレッドで実行されています)。関連する質問の私の最後の答えを確認してください。

于 2012-10-16T14:45:28.887 に答える
0

ここで明確にする必要があると思います。クライアント側の遅延ではなく、サーバー側の遅延をシミュレートする必要があります。スリープコードは、クライアント側のコードではなく、サーバー側のコードに配置する必要があります。

そうでない場合は、asyncTaskを使用してアプリケーションコードを実行できます。その中にスリープコードを入れて、クライアント側の遅延をシミュレートできます。

于 2012-10-16T14:47:24.390 に答える