2011-07-05 38 views
3

快速概要:我正在製作一個應用程序,用於解析二進制文件,存儲頂點及其屬性,並將它們顯示在openGL中。我試圖在解析時執行ProgressDialog,但我遇到了相當大的麻煩。我試過在很多地方落實這一點,但是這是我的當前設置:Android 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; 
       } 
      } 


} 

當我打電話對話框=新ProgressDialog(背景);它在空指針異常上的錯誤,我假設,因爲有一個上下文問題...有沒有人有任何想法?

+1

LogCat說什麼? – CaseyB

+0

無法啓動活動....錯誤/ AndroidRuntime(25782):在... OpenGLRenderer $ ProgressTask。 (OpenGLRenderer.java:303),這是我在問題中標記的那個。 – RedLeader

回答

2

也許嘗試用setLAS()方法內的「OpenGLRenderer.this」替換「this」。它看起來不像你發佈的代碼,但有時如果你是從不同的對象類型進行調用,它會嘗試傳遞一個OnClickListener(或者你調用的任何對象)而不是一個活動,因此對象沒有上下文。就像我說的似乎並不是這樣,但值得一試。

另外你在哪裏調用setLAS()?也許張貼您的代碼的部分。

編輯:

嘗試修改您的setLAS()方法有一個上下文參數,並從你的第一個活動中傳遞,只是從第二活動異步任務一起傳遞它,而不是使用上下文的第二項活動。

+0

是的,我也想到了,我只是試了一下,錯誤是完全一樣的。在我發佈的第一個代碼塊中,在setContentView()之前調用setLAS()。 -謝謝! – RedLeader

+0

奇數,請參閱編輯,並返回,如果它有任何作用=) – FoamyGuy

+0

這使得一切正常,除了ProgressDialog不會隨着時間更新,我會懷疑inazaruk知道這是爲什麼。 - 真棒幫助謝謝你! – RedLeader

3

首先,你不應該自己創建OpenGLRenderer,因爲它的一個Activity,應該由系統管理。當您自己創建OpenGLRenderer時,則此活動的上下文未正確初始化。並且當您創建ProgressDialog具有無效上下文時,您會收到NullPointerException


但是,即使你正常啓動OpenGlRenderer,您的應用程序仍然會崩潰在行:

dialog.setProgress(percentParsed); 

您應該使用publishProgress,而不是和的AsyncTask的onProgressUpdate功能更新ProgressDialog。這是因爲您無法從非ui線程更新UI。

+0

我在寫這篇文章時在線查看了onProgressUpdate函數,但是是否必須在某處手動調用?何時處理?此外,在這一點上,這甚至很重要,因爲我無法創建對話框?我還將如何設置我的渲染器? – RedLeader

+0

我還應該說,在我通過對話理念和AsyncTask功能之前,一切都很好。 – RedLeader

+0

我已經更新了關於創建對話框時爲什麼會收到異常的答案。另外,關於'onProgressUpdate',在你從'doInBackground()'函數調用'publishProgress'之後,在UI線程上調用這個函數。 – inazaruk