2012-10-24 54 views
0

我正在開發一個Activity,它從XML中回憶數據並顯示它。在Android中使用progressDialog時出錯

我做了一些測試,我猜問題是處理ProgressDialog,下面的代碼工作時,我加載數據推按鈕刷新,但如果我試圖收集數據,而不按下按鈕(如果我省略loadData())的評論我得到一個錯誤。

所以我想問題是在ProgressDialog,但我無法檢測到它。

public class TabFeed extends ListActivity implements Callback { 

    private TabFeedController controller; 
    private ProgressDialog progressDialog; 
    public String _feedURL; 

    private final Handler progressHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      setData(); 
      progressDialog.dismiss(); 
     } 
    }; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.tabfeed); 

     controller = new TabFeedController(MainTabs.model); 
     controller.addOutboxHandler(new Handler(this)); 
     /** It gets the _feedURL through a Handler (TabFeedController) */ 
     controller.handleMessage(TabFeedController.MESSAGE_SHOW_FEED, null, null); 

     Button btn = (Button) findViewById(R.id.btnLoad); 

     **//loadData();** 
     btn.setOnClickListener(new OnClickListener() {   
      public void onClick(View v) { 
       LinkedList<Element> data = controller.getDataFeed(); 
       if (data != null) { 
        AlertDialog.Builder builder = new AlertDialog.Builder(TabFeed.this); 
        builder.setMessage("New loading?").setCancelable(false).setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          loadData(); 
         } 
        }) 
     .setNegativeButton("No", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          dialog.cancel();         
         } 
        }).create().show();       
       } else { 
        loadData(); 
       } 
      } 
     }); 
    } 

    private void setData(){ 
     this.setListAdapter(new AdapterFeedList(this, R.layout.row, 0, controller.getDataFeed())); 
    } 

    private void loadData() { 
     progressDialog = ProgressDialog.show(TabFeed.this,"", "Loading...", true); 

     new Thread(new Runnable(){ 
      public void run() { 
       XMLParser parser = new XMLParser(_feedURL); 
       controller.setDataFeed(parser.parse()); 
       progressHandler.sendEmptyMessage(0); 
      } 
     }).start(); 
    } 

    public boolean handleMessage(Message msg) { 

     switch(msg.what) { 
      case TabFeedController.MESSAGE_MODEL_GETFEED: 
       runOnUiThread(new Runnable() { 
        public void run() { 
         _feedURL = TabFeedController.FEEDURL; 
        } 
       }); 
       return true; 
      } 
      return false; 
     } 
    } 
} 

我收到以下錯誤,當我與onClickListener按鈕前行loadData編譯:

10-25 01:46:17.992: ERROR/AndroidRuntime(21460): FATAL EXCEPTION: Thread-13 
10-25 01:46:17.992: ERROR/AndroidRuntime(21460): java.lang.RuntimeException: java.lang.NullPointerException 
10-25 01:46:17.992: ERROR/AndroidRuntime(21460):  at ilias.XMLParser.XMLParser.parse(XMLParser.java:83) 
10-25 01:46:17.992: ERROR/AndroidRuntime(21460):  at ilias.activities.TabFeed$3.run(TabFeed.java:115) 
10-25 01:46:17.992: ERROR/AndroidRuntime(21460):  at java.lang.Thread.run(Thread.java:1019) 
10-25 01:46:17.992: ERROR/AndroidRuntime(21460): Caused by: java.lang.NullPointerException 
10-25 01:46:17.992: ERROR/AndroidRuntime(21460):  at ilias.XMLParser.XMLParser.parse(XMLParser.java:36) 
10-25 01:46:17.992: ERROR/AndroidRuntime(21460):  ... 2 more 

我不知道這是否是有幫助的。當我編譯它沒有行loadData,它完美的工作,但我只是想先加載數據沒有推任何按鈕,這就是爲什麼我加載數據,並開始progressClick對象的事件onClick的範圍。

感謝

+2

你可以發佈你所得到的錯誤? –

回答

0

你有沒有真正嘗試一下在AlertDialog「是」按鈕?因爲你似乎從來沒有到過那裏。我這樣說是因爲乍看之下,錯誤是說_feedURLnull(如果你沒有忽略任何變量永遠不會被初始化的東西),並且當你說它的工作時,它實際上並不是(你不會在setData()之後調用setData()手動刷新)。

更新:

現在,我們有一些更多的信息,我可以reensure我的答案,_feedURLnull,那是因爲你給它一個值,好像它是從不同的線程,因爲你是用被稱爲runOnUiThread。當你打這個電話時,它會被推遲到當前的線程結束,並且在那個時刻所有的壞運氣loadData()被調用,所以它的價值不及時。當你用按鈕來做時,它有足夠的時間來執行這兩個動作,這就是爲什麼。一個快速的解決辦法是去除runOnUiThread部分(handler是活動本身,所以你是在UI線程上),但我想這是最好問這個問題:

爲什麼你甚至使用處理程序給變量賦值?

如果你想給它一個值,只要給它,刪除所有泰德處理部分和onCreate()地說:

_feedURL = TabFeedController.FEEDURL; 
+0

對不起,我省略了一些代碼,因爲我認爲這是不必要的,我會編輯它。該代碼顯示了我如何獲得_feedURL。 – Davis

+0

哦,我已經檢測到這個問題。如果我直接在「XMLParser parser = new XMLParser(_feedURL);」中寫入Feed的URL,有用。但我不明白爲什麼它通過按鈕正確得到它,而不是如果我在onClick之前loadData。 – Davis

+0

更新的答案 – ZhDev