Проблемы контекста Android ProgressDialog - PullRequest
3 голосов
/ 05 июля 2011

Краткое резюме: я делаю приложение, которое анализирует двоичный файл, сохраняет вершины и их свойства и отображает их в 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 = newProgressDialog (context); Это ошибки в исключении нулевого указателя, я предполагаю, потому что есть проблема контекста ... У кого-нибудь есть какие-нибудь идеи?

Ответы [ 2 ]

3 голосов
/ 05 июля 2011

Во-первых, вы не должны создавать OpenGLRenderer самостоятельно, потому что это Activity и должно управляться системой.Когда вы создаете OpenGLRenderer самостоятельно, контекст этого действия инициализируется неправильно.И когда вы создаете ProgressDialog с недопустимым контекстом, вы получаете NullPointerException.


Но даже если вы правильно запустите OpenGlRenderer, ваше приложение все равно будет зависать в строке:

dialog.setProgress(percentParsed);

Вместо этого следует использовать publishProgress и обновить ProgressDialog в функции AsyncTask onProgressUpdate.Это потому, что вы не можете обновить пользовательский интерфейс из не-пользовательского потока.

2 голосов
/ 05 июля 2011

возможно попробуйте заменить "this" на "OpenGLRenderer.this" внутри вашего метода setLAS (). Это не похоже на код, который вы опубликовали, но иногда, если вы делаете этот вызов из другого типа объекта, он пытается передать OnClickListener (или любой другой объект, из которого вы вызываете) вместо действия, таким образом, У объекта нет контекста. Как я уже сказал, это не так, но стоит того.

Также откуда вы вызываете setLAS ()? возможно, опубликуйте и этот раздел вашего кода.

Edit:

Попробуйте изменить метод setLAS () таким образом, чтобы он имел параметр Context и передавал его из первого действия, а просто передавал его из второго действия в асинхронную задачу вместо использования контекста из второго действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...