Android ProgressDialog上下文问题

时间:2011-07-05 15:55:24

标签: android progressdialog android-context

快速摘要:我正在创建一个解析二进制文件,存储顶点及其属性的应用程序,并在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); 它在空指针异常时出错,我假设是因为存在上下文问题...有没有人有任何想法?

2 个答案:

答案 0 :(得分:3)

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


但即使您正确启动OpenGlRenderer,您的应用仍然会在以下行崩溃:

dialog.setProgress(percentParsed);

您应该使用publishProgress并在AsyncTask的onProgressUpdate函数中更新ProgressDialog。那是因为你无法从非ui线程更新UI。

答案 1 :(得分:2)

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

你在哪里调用setLAS()?或者也可以发布你的代码部分。

编辑:

尝试修改setLAS()方法以获取Context参数并将其从第一个活动传入,并将其从第二个活动传递到异步任务,而不是使用第二个活动的上下文。