Android: ProgressDialog и проблема с отображением данных из XML - PullRequest
0 голосов
/ 21 сентября 2011

Я анализирую XML с URL и показываю его. Я хочу показать ProgressDialog, в то время как мой метод парсера XML анализирует XML и готовит его к показу. Проблема, с которой я сталкиваюсь, заключается в том, что после 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, но после диалога прогресса он показывает пустой экран. Пожалуйста, помогите мне разобраться с этой проблемой.

Спасибо

Ответы [ 3 ]

2 голосов
/ 21 сентября 2011
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.
        }   
    }
}

теперь, вероятно, впервые вызовите asycTask в onCreate ().

new xyz().execute()

создайте функцию для установки таймера для обновления, мы делаем это с помощью postDelayed.

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

private Runnable runner  = new Runnable(){
         public void run(){
               new xyz().execute();
         }
}
2 голосов
/ 21 сентября 2011

Я думаю, вам нужно реализовать 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();
1 голос
/ 21 сентября 2011

добавить функцию 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();
    }
}
...