在长时间运行期间没有显示进度微调器

时间:2015-04-06 13:07:18

标签: java android progress-bar

我正在为Android编写一个卡片播放应用程序。有时计算机播放器可以播放1-3秒,在此期间我想显示圆形不确定的微调器。问题是旋转器在此期间没有显示"思考"时间虽然确实在测试中显示出来。

这是我的微调片段:

    <ProgressBar
    android:id="@+id/progressCircle"
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/draw_and_discard_piles"
    android:layout_centerHorizontal="true"
    android:visibility="gone"/>

以及用于在OnCreate期间对其进行充气的相应代码段:

    spinner = (ProgressBar)findViewById(R.id.progressCircle);
    spinner.setVisibility(View.GONE);

并显示它:

void showSpinner(final boolean show) {
    spinner.setVisibility(show ? View.VISIBLE : View.GONE);
    spinner.invalidate();
}

在长时间播放期间,我执行以下操作,其中DiscardOrDrawThread是内部类:

    //if Computer, we decide here whether to draw or discard
    final long playerStartTime = System.currentTimeMillis();

    class DiscardOrDrawThread extends Thread {
        private Game.PileDecision pickFrom;
        DiscardOrDrawThread() {
            pickFrom = null;
        }

        @Override
        public void run() {
            pickFrom = tryDiscardOrDrawPile(isFinalTurn, deck.discardPile.peekNext(), deck.drawPile.peekNext());
        }
    }
    DiscardOrDrawThread discardOrDrawThread = new DiscardOrDrawThread();

    myActivity.showSpinner(true);
    try {
        discardOrDrawThread.start();
        discardOrDrawThread.join();
    }catch(RuntimeException e) {
        System.out.println("takeTurn: thread join RuntimeException");
    }catch (InterruptedException e) {
        throw new RuntimeException("Interrupted in takeTurn");
    }
    myActivity.showSpinner(false);

实际播放代码工作正常,如果我注释掉myActivity.showSpinner(false),那么微调器将正确显示,从长时间运行的部分(tryDiscardOrDrawPile)开始。但如果它没有被注释掉,那么微调器就不会显示出来。

有人能指出我做错了吗?

2 个答案:

答案 0 :(得分:0)

  

在长时间运行期间未显示进度微调器

由于discardOrDrawThread.join();

  

为什么?

discardOrDrawThread.join();导致当前线程(主UI-Thread)暂停执行,直到discardOrDrawThread的线程终止

使用AsyncTaskrunOnUiThread在后台执行长时间运行的操作

答案 1 :(得分:0)

我使用AsyncTask重新实现了我的代码(正如许多帖子建议的ProgressBars),如下所示,现在一切正常。

       class DiscardOrDrawTask extends AsyncTask<Void, Void, Game.PileDecision> {

        @Override
        protected Game.PileDecision doInBackground(Void... params) {
            final Game.PileDecision pickFrom = tryDiscardOrDrawPile(isFinalTurn, deck.discardPile.peekNext(), deck.drawPile.peekNext());
            return pickFrom;
        }

        @Override
        protected void onPreExecute() {
            myActivity.showSpinner(true);
        }

        @Override
        protected void onPostExecute(final Game.PileDecision pickFrom) {
            myActivity.showSpinner(false);
            myActivity.animateComputerPickUpAndDiscard(playerMiniHandLayout, pickFrom);
        }
    }
    DiscardOrDrawTask discardOrDrawTask= new DiscardOrDrawTask();
    discardOrDrawTask.execute();