【问题标题】:Android ProgressDialog context problemsAndroid ProgressDialog 上下文问题
【发布时间】:2011-07-05 15:55:23
【问题描述】:

快速总结:我正在制作一个解析二进制文件、存储顶点及其属性并在 openGL 中显示它们的应用程序。我正在尝试在解析时实现 ProgressDialog,但遇到了相当大的麻烦。我已经尝试在很多地方实现这一点,但这是我目前的设置:

    public class PointViewer extends Activity{
     ...
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            Bundle extras = getIntent().getExtras();
            filePath = extras.getString("file_path");

            mGLView = new GLSurfaceView(this);
            theRenderer = new OpenGLRenderer();
            mGLView.setRenderer(theRenderer);
            //Parse the file and set the arrays
            theRenderer.setLAS(filePath);
            setContentView(mGLView);

        }
     ...
    }

渲染类...

public class OpenGLRenderer extends Activity implements GLSurfaceView.Renderer {
         ...
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

            }

            public void setLAS (String fileName){

                new ProgressTask(this).execute();


            }
        ...
        /*
         * The class for the progress dialog 
        */
        private class ProgressTask extends AsyncTask<String, Void, Boolean> {
           private ProgressDialog dialog;
           private Context context;

           //private List<Message> messages;
           public ProgressTask(Context ctx) {

               context = ctx;
               dialog = new ProgressDialog(context);
           }



           /** progress dialog to show user that the backup is processing. */

           protected void onPreExecute() {
               this.dialog.setMessage("Progress start");
               this.dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
               this.dialog.show();
           }

            @Override
           protected void onPostExecute(final Boolean success) {


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

               if (success) {
                   Toast.makeText(context, "OK", Toast.LENGTH_LONG).show();
               } else {
                   Toast.makeText(context, "Error", Toast.LENGTH_LONG).show();
               }
           }

           protected Boolean doInBackground(final String... args) {
               try{    
                ptCloud = new PointCloud(args[0]);

                    ...

                   dialog.setProgress(percentParsed);
                   return true;
                } catch (Exception e){
                   Log.e("tag", "error", e);
                   return false;
                }
             }


}

当我调用 dialog = new ProgressDialog(context); 它在空指针异常时出错,我假设是因为存在上下文问题...有人有什么想法吗?

【问题讨论】:

  • 无法启动活动.... ERROR/AndroidRuntime(25782): at ...OpenGLRenderer$ProgressTask.(OpenGLRenderer.java:303),我在问题中标记的那个。

标签: android progressdialog android-context


【解决方案1】:

首先,您不应该自己创建OpenGLRenderer,因为它是一个Activity,并且应该由系统管理。当您自己创建 OpenGLRenderer 时,此活动的上下文初始化不正确。当您使用无效上下文创建 ProgressDialog 时,您会收到 NullPointerException


但是即使你正确地启动OpenGlRenderer,你的应用仍然会在一行中崩溃:

dialog.setProgress(percentParsed);

您应该改用publishProgress 并更新AsyncTask 的onProgressUpdate 函数中的ProgressDialog。那是因为你不能从非 ui 线程更新 UI。

【讨论】:

  • 我在写这篇文章的时候在线查看了onProgressUpdate函数,但是必须在某个地方手动调用它吗?什么时候处理。此外,在这一点上,这是否重要,因为我无法创建对话框?我还要如何设置我的渲染器?
  • 我还应该说,在我通过对话框想法和 AsyncTask 功能之前,一切都很好。
  • 我已经更新了关于为什么在创建对话框时收到异常的答案。另外,关于onProgressUpdate,在您从doInBackground() 函数调用publishProgress 之后,在UI 线程上调用此函数。
  • 我对“自己创建 OpenGLRenderer”的意思感到困惑。几周前当我审查 OpenGL 时,每个人似乎都像我在这里所做的一样(减去活动扩展,我想通过它来传递上下文)。我想我只是对如何获得正确的上下文感到困惑,因为它一直在寻找直到对话实现。 -也谢谢你的帮助
  • 那么不要扩展Activity 和路径Context 值作为OpenGLRenderer 的构造函数的参数。例如将上下文保存到mContext 字段,当您要创建ProgressDialog 时,您将使用new ProgressDialog(mContext)
【解决方案2】:

也许可以尝试在 setLAS() 方法中将“this”替换为“OpenGLRenderer.this”。从您发布的代码中看起来并不像它,但有时如果您从不同的对象类型进行调用,它会尝试传入 OnClickListener(或您调用的任何对象)而不是活动,因此对象没有上下文。就像我说的那样,情况似乎并非如此,但值得一试。

另外,您从哪里调用 setLAS()?也许也发布您的代码的那部分。

编辑:

尝试修改您的 setLAS() 方法以具有 Context 参数并从您的第一个活动传递它,然后将它从第二个活动传递到异步任务,而不是使用来自第二个活动的上下文。

【讨论】:

  • 是的,我也想到了,我刚试了一下,错误是完全一样的。在我 setContentView() 之前,在我发布的第一个代码块中调用了 setLAS()。 -谢谢!
  • 这使得一切正常,除了 ProgressDialog 不会随着时间的推移而更新,我怀疑 inazaruk 知道这是为什么。 - 很棒的帮助,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
相关资源
最近更新 更多