In android this program not retrieve the xml data

2019-08-12 22:56发布

问题:

\In android programming..i like to retrieve data's in the xmltags from url(xmlparsing) in the meantime i want to load progress until the data retrieve from xmltags. i attach my code check whether its rite or wrong thank you\

 \\main activity\\


public class act extends Activity
{

 \\button used to start the function after the click\\

    Button b;
    public ProgressDialog mDialog;
    @Override
     public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        b=(Button)findViewById(R.id.button1);
        b.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                new GetTask().execute();

            }
        });
}
   \\my asynctask\\

class GetTask extends AsyncTask<Object, Void, String>
{



    @Override
    protected void onPreExecute()
    {
        super.onPreExecute();

         mDialog = new ProgressDialog(act.this);
         mDialog.setMessage("Please wait...");
         mDialog.show();
    }
     @Override
    protected String doInBackground(Object... params)
    {

  \\ui programetically declare the textviews\\

                 try {
                    LinearLayout layout = new LinearLayout(act.this);
                    layout.setOrientation(1);
                    TextView no[];
                    TextView na[];
                    TextView c[];


                  URL url = new URL("http://api.androidhive.info/pizza/?format=xml");          
                  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();          
                  DocumentBuilder db = dbf.newDocumentBuilder();
                  Document doc = db.parse(new InputSource(url.openStream()));
                  doc.getDocumentElement().normalize();
                  NodeList nodeList = doc.getElementsByTagName("item");
                  no = new TextView[nodeList.getLength()];
                  na = new TextView[nodeList.getLength()];
                  c = new TextView[nodeList.getLength()];

                  for (int i = 0; i < nodeList.getLength(); i++) {
                      Node node = nodeList.item(i);
                      no[i] = new TextView(act.this);
                      na[i] = new TextView(act.this);
                      c[i] = new TextView(act.this);
                      Element fstElmnt = (Element) node;

                      NodeList idlist = fstElmnt.getElementsByTagName("id");
                      Element numelement = (Element) idlist.item(0);
                      idlist = numelement.getChildNodes();
                      no[i].setText("ID="+ ((Node) idlist.item(0)).getNodeValue());

                      NodeList namelist = fstElmnt.getElementsByTagName("name");
                      Element namelement = (Element) namelist.item(0);
                      namelist = namelement.getChildNodes();
                      na[i].setText("pizza name="+ ((Node) namelist.item(0)).getNodeValue());

                      NodeList costlist = fstElmnt.getElementsByTagName("cost");
                      Element costlement = (Element) costlist.item(0);
                      costlist = costlement.getChildNodes();
                      c[i].setText("cost="+ ((Node) costlist.item(0)).getNodeValue());

                      layout.addView(no[i]);
                      layout.addView(na[i]);
                      layout.addView(c[i]);
                      setContentView(layout);

                      }} 
             catch (Exception e) {
                     }
        return null;

            }

            @Override
    protected void onPostExecute(String result)
    {
        super.onPostExecute(result);
        mDialog.dismiss(); 

            }
   }
  }

回答1:

The Following code is Wrong.

U dont have any data in your onPostExecute() so whatever youe want to display just show that thing in onPostExecute() instead of doInBackground().

So change it ..

A sample example u can find in LazyLoading Or Asynctask App:-

https://github.com/thest1/LazyList

https://github.com/ethervoid/android-async-task-example

May with following code u can get ur ans...!!!!



回答2:

First u cannot make the UI related actions in the doInBackground()

If u want u can do it in the onPostExecute() after completed the doInBackground() process ...

So change ur logic ..



回答3:

NodeList namelist;
String[] no,na,c;
 try {
              URL url = new URL("http://api.androidhive.info/pizza/?format=xml");          
              DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();          
              DocumentBuilder db = dbf.newDocumentBuilder();
              Document doc = db.parse(new InputSource(url.openStream()));
              doc.getDocumentElement().normalize();
              NodeList nodeList = doc.getElementsByTagName("item");

              no = new String[nodeList.getLength()];
              na = new String[nodeList.getLength()];
              c = new String[nodeList.getLength()];
              for (int i = 0; i < nodeList.getLength(); i++) {
                  Node node = nodeList.item(i);

                  Element fstElmnt = (Element) node;

                  NodeList idlist = fstElmnt.getElementsByTagName("id");
                  Element numelement = (Element) idlist.item(0);
                  idlist = numelement.getChildNodes();
                  no[i]=((Node) idlist.item(0)).getNodeValue();                     

                  NodeList namelist = fstElmnt.getElementsByTagName("name");
                  Element namelement = (Element) namelist.item(0);
                  namelist = namelement.getChildNodes();
                  na[i]=((Node) namelist.item(0)).getNodeValue()

                  NodeList costlist = fstElmnt.getElementsByTagName("cost");
                  Element costlement = (Element) costlist.item(0);
                  costlist = costlement.getChildNodes();


                  }} 
         catch (Exception e) {
                 }
    return null;

        }

        @Override
protected void onPostExecute(String result)
{
    super.onPostExecute(result);
                LinearLayout layout = new LinearLayout(act.this);
                layout.setOrientation(1);
                TextView no[];
                TextView na[];
                TextView c[];
              no = new TextView[nodeList.getLength()];
              na = new TextView[nodeList.getLength()];
              c = new TextView[nodeList.getLength()];
              for (int i = 0; i < nodeList.getLength(); i++) {

                  no[i] = new TextView(act.this);
                  na[i] = new TextView(act.this);
                  c[i] = new TextView(act.this);
                  no[i].setText("ID="+no[i] );
                 na[i].setText("pizza name="+ na[i]);
                c[i].setText("cost="+ ((Node) costlist.item(0)).getNodeValue());

                  layout.addView(no[i]);
                  layout.addView(na[i]);
                  layout.addView(c[i]);
                  setContentView(layout);
    mDialog.dismiss(); 

        }