在Android中使用progressDialog时出错

时间:2012-10-24 23:29:27

标签: android progressdialog

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

由于

1 个答案:

答案 0 :(得分:0)

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

更新

既然我们有更多信息可以回复我的答案,_feedURL就是null,而这恰好是因为你给它一个值,好像它是从另一个线程调用的,因为你是使用runOnUiThread。当你进行那个调用时,它会被推迟到当前线程结束,并且在那一刻正在调用所有运气不好的loadData(),所以它的值不及时。使用按钮执行此操作时,它有足够的时间执行这两个操作,这就是原因。一个快速的解决方案是删除runOnUiThread部分(处理程序是活动本身,所以你在UI线程上),但我想最好问这个问题:

  

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

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

_feedURL = TabFeedController.FEEDURL;