我正在开发一个从 XML 中收集数据并显示它的活动。
我做了一些测试,我猜问题是处理 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 行的情况下编译它时,它工作得很好,但我只想先加载数据而不按任何按钮,这就是为什么我加载数据并在 onClick 事件范围之外启动 progressDialog。
谢谢