0

我正在开发一个从 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。

谢谢

4

1 回答 1

0

您是否真的尝试过点击“是”按钮AlertDialog?因为看起来你实际上从未到达那里。我这样说是因为乍一看错误是说_feedURLnull如果您没有省略任何变量,则该变量永远不会被初始化),而当您说它正在工作时,实际上却不是(setData()手动刷新后您也不会调用) .

更新:

现在我们有了更多信息,我可以再次确定我的答案_feedURLis null,并且发生这种情况是因为您给它一个值,就好像它是从不同的线程调用的一样,因为您正在使用runOnUiThread. 当您进行该调用时,它会被推迟到当前线程完成为止,并且loadData()在那一刻调用了所有的坏运气,因此它的值没有及时出现。当您使用按钮执行此操作时,它有足够的时间执行这两个操作,这就是原因。一个快速的解决方案是删除runOnUiThread部分(处理程序是活动本身,所以你在 UI 线程上),但我想最好问这个问题:

为什么你甚至使用处理程序来为变量赋值?

如果你想给它一个值,只需给它,删除所有处理程序部分并onCreate()放入:

_feedURL = TabFeedController.FEEDURL;
于 2012-10-25T00:07:58.410 回答