0

我正在从 URL 解析 XML 并显示它。我想在我的 XML 解析器方法解析 XML 并准备好显示时显示 ProgressDialog。我面临的问题是 ProgressDialog 之后没有显示数据,而是显示空白屏幕。

这是我的代码:

ArrayList<XMLItem> items= new ArrayList<XMLItem>();
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.mydata);
    adapter= new MyAdapter(this, R.layout.customcell, items);
    listView= (ListView) findViewById(id.ListView01);
    listView.setAdapter(adapter);

    final ProgressDialog dialog = ProgressDialog.show(this, "", "Loading. Please wait...", true);

    Thread thread=new Thread(new Runnable(){

        public void run(){

            doTheAutoRefresh();
            runOnUiThread(new Runnable(){

                public void run() {
                    if(dialog.isShowing())
                        dialog.dismiss();
                            adapter.notifyDataSetChanged(); //this line throws an exception and if i comment this line, blank screen is shown

                }

            });
        }

        });
        thread.start(); 
}

private void doTheAutoRefresh() {
    handler.postDelayed(new Runnable() {
        public void run(){
            loadData(); // this is where you put your refresh code
            doTheAutoRefresh();
             }
         }, 15000);

}

private void loadData(){
    Document doc;
    try {
        doc = XMLReader.parseURL("my url to parse xml");



    NodeList nl = doc.getElementsByTagName("l");



    for(int i=0; i<nl.getLength(); i++){

        NamedNodeMap np = nl.item(i).getAttributes();

        String t= np.getNamedItem("htn").getNodeValue();
        String sT= np.getNamedItem("atn").getNodeValue();
        XMLItem item= new XMLItem(t, sT);
        items.add(item);

    }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

此代码完美显示 ProgressDialog,但在进度对话框之后,它显示空白屏幕。请帮我解决这个问题。

谢谢

4

3 回答 3

2

我认为你需要实现 AsyncTask ::

private class xyz extends AsyncTask<Void, Void, Void> {
    private final ProgressDialog dialog = new ProgressDialog(tranning.this);

    @Override
    protected void onPreExecute() {
        this.dialog.setMessage("Please Wait...");
        this.dialog.show();
        // put your code which preload with processDialog  
    }


    @Override
    protected Void doInBackground(Void... arg0) {
        // put your code here
        return null;
    }

    @Override
    protected void onPostExecute(final Void unused) {
        if (this.dialog.isShowing()) {
          this.dialog.dismiss();

        }   
    }
}

并在 main :: 中使用它

new xyz().execute();
于 2011-09-21T07:37:54.867 回答
2
private class xyz extends AsyncTask<Void, Void, Void> {
    private final ProgressDialog dialog = new ProgressDialog(tranning.this);

    @Override
    protected void onPreExecute() {
        this.dialog.setMessage("Please Wait...");
        this.dialog.show();  
    }


    @Override
    protected Void doInBackground(Void... arg0) {
        // do your load data function part here.
        // just populate the data structures that are necessary 
        // for the adapter.
        return null;
    }

    @Override
    protected void onPostExecute(final Void unused) {
        if (this.dialog.isShowing()) {
          this.dialog.dismiss();
          // notify adapter here.
          adapter.notifyDataSetChanged();
          refreshTimer(); // to do the same thing after 15 seconds.
        }   
    }
}

现在可能在您的 onCreate() 中第一次调用 asycTask。

new xyz().execute()

创建一个函数来设置一个刷新计时器,我们使用 postDelayed 来做到这一点。

private void refreshTimer(){
       handler.postDelayed( runner , 15000);
}

private Runnable runner  = new Runnable(){
         public void run(){
               new xyz().execute();
         }
}
于 2011-09-21T09:17:39.910 回答
1

添加一个函数showData()并在关闭对话框后调用它

ArrayList<XMLItem> items= new ArrayList<XMLItem>();
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.mydata);

    listView= (ListView) findViewById(id.ListView01);

    final ProgressDialog dialog = ProgressDialog.show(this, "", "Loading. Please wait...", true);

    Thread thread=new Thread(new Runnable(){

        public void run(){

            loadData();
            runOnUiThread(new Runnable(){

                public void run() {
                    if(dialog.isShowing()){
                        dialog.dismiss();
                        showData(); //////////////////////////////////////
                    }

                }

            });
        }

        });
        thread.start(); 
}
private void showData(){
    adapter= new MyAdapter(this, R.layout.customcell, items);
    listView.setAdapter(adapter);
}
private void loadData(){
    Document doc;
    try {
        doc = XMLReader.parseURL("my url to parse xml");



    NodeList nl = doc.getElementsByTagName("l");



    for(int i=0; i<nl.getLength(); i++){

        NamedNodeMap np = nl.item(i).getAttributes();

        String t= np.getNamedItem("htn").getNodeValue();
        String sT= np.getNamedItem("atn").getNodeValue();
        XMLItem item= new XMLItem(t, sT);
        items.add(item);

    }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
于 2011-09-21T07:50:46.863 回答