【问题标题】:ProgressDialog not being displayed in Activity with custom ViewProgressDialog 没有显示在带有自定义视图的 Activity 中
【发布时间】:2014-04-13 22:59:52
【问题描述】:

我正在开发一个有 2 个类的 Android 应用。扩展 Activity 的 Game,以及扩展 View 的 GameView。

当游戏加载时,它会将内容视图设置为 GameView,它只是一个使用画布显示游戏的绘图类。

我正在尝试在 Game 类中创建一个 ProgressDialog,它会在完成某个操作后显示一个微调器,因为这需要很长时间才能完成。到目前为止,我有以下内容:

setContentView(R.layout.activity_game);
ProgressDialog pd = new ProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.setMessage("Calculating hint");
pd.show();
AsyncTask<String[][], Void, SudokuSquare> nextSquareThread = new GetNextSquare().execute(puzzleNumbers);
next = nextSquareThread.get();
pd.dismiss();
setContentView(gameView);

我的 AsyncTask 类看起来像这样:

private class GetNextSquare extends AsyncTask<String[][], Void, SudokuSquare> {

    private ProgressDialog dialog = new ProgressDialog(Game.this);

    @Override
    protected void onPreExecute() {
        this.dialog.setMessage("Finding next number");
        this.dialog.show();
    }

    @Override
    protected SudokuSquare doInBackground(final String[][]... args) {
        try {
            SudokuAdvancedSolver solver = new SudokuSolver(args[0]);
            return solver.getOneValue();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    protected void onPostExecute(final SudokuSquare result) {

        if (dialog.isShowing()) {
            dialog.dismiss();
        }
    }
}

目前我有两个 ProgressDialog,一个在 AsyncTask 内部,一个在外部。哪一个是正确的?此外,微调器根本没有显示。我忽略了什么导致这种情况?

【问题讨论】:

    标签: java android android-layout android-asynctask


    【解决方案1】:

    只有外面的那个是正确的。因为您正在通过另一个线程(您的异步任务)尝试主线程(您的活动的 UI 线程)。你应该使用一个处理程序来代替这个: 1/你显示进度条 2/ 你在一个线程中加载游戏 3/ 游戏加载后,您向处理程序发送一条消息,该处理程序将停止进度条。

    看到这个exemple。您应该在处理程序中关闭您的对话框(当处理程序从线程接收到消息时)。

    【讨论】:

      【解决方案2】:

      如果您没有在 Asynctask 上实现侦听器,我建议您在 PostExecute 上关闭进度对话框

      private ProgressDialog dialog;
      
      public void setProgressDialog(ProgressDialog dialog){
          this.dialog = dialog;
      }
      
      @Override
      protected void onPostExecute(final SudokuSquare result) {
      dialog.dismiss();       
      }
      

      在执行 Asynctask 之前添加此代码

      nextSquareThread.setProgressDialog(pd);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-08
        • 2012-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多