我正在开发一个Activity,它从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。
由于
答案 0 :(得分:0)
您是否真的尝试点击AlertDialog
上的“是”按钮?因为看起来你实际上从未到过那里。我这样说是因为乍一看错误是说_feedURL
是null
(如果你没有提到任何变量从未被初始化的话),当你说它工作时它实际上不是(手动刷新后不要调用setData()
。
更新
既然我们有更多信息可以回复我的答案,_feedURL
就是null
,而这恰好是因为你给它一个值,好像它是从另一个线程调用的,因为你是使用runOnUiThread
。当你进行那个调用时,它会被推迟到当前线程结束,并且在那一刻正在调用所有运气不好的loadData()
,所以它的值不及时。使用按钮执行此操作时,它有足够的时间执行这两个操作,这就是原因。一个快速的解决方案是删除runOnUiThread
部分(处理程序是活动本身,所以你在UI线程上),但我想最好问这个问题:
为什么你甚至使用处理程序为变量赋值?
如果你想给它一个值,只需给它,删除所有的处理程序部分和onCreate()
put:
_feedURL = TabFeedController.FEEDURL;