0

Asynctask在 Android 中遇到了一个错误,我想用它来通过 Web 服务获取数据并将它们绑定到网格视图上

    public class ProductList extends Activity 

{

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ``this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_product_list);
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            ad=extras.getString("ad");
            catid=extras.getString("catid");
            greeting=(TextView)findViewById(R.id.greetingsText); 
            greeting.setText("Ho�geldiniz, "+extras.getString("ad"));
        }
        Products get = new Products();
        try {
            productsList=get.execute(new String[] { Integer.toString(Integer.parseInt(catid)+1) }).get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        for (int i = 0; i < productsList.size(); i++) {
            System.out.println(productsList.get(i).ad);
        }
    }
    public ArrayList<ProductData> productsList = new ArrayList<ProductData>();
    public class ProductData
    {
        public ProductData()
        {

        }

        public ProductData(int id,String ad,String fiyat,String kisaca,String link,String status)
        {
            this.id=id;
            this.ad=ad;
            this.fiyat=fiyat;
            this.kisaca=kisaca;
            this.link=link;
            this.status=status;
        }

        public String status;
        public int id;
        public String ad;
        public String fiyat;
        public String kisaca;
        public String link;
    }
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    }
    private class Products extends AsyncTask<String,  ArrayList<ProductData>, ArrayList<ProductData>> {

        @Override
        protected  ArrayList<ProductData> doInBackground(String... params) {
             URL url;
             ArrayList<ProductData> productsL = new ArrayList<ProductData>();
                try


                {
                     url = new URL("http://www.sucukevim.com/external_services.php?service=get_product_list&&type=filter&&catid="+params[0]);
                URLConnection connection;
                connection = url.openConnection();

                HttpURLConnection httpConnection = (HttpURLConnection)connection;
                int responseCode = httpConnection.getResponseCode();

                if(responseCode==HttpURLConnection.HTTP_OK)
                {
                    InputStream in = httpConnection.getInputStream();

                    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                    DocumentBuilder db = dbf.newDocumentBuilder();

                    Document dom = db.parse(in);

                    Element docEle = dom.getDocumentElement();

                    NodeList nl = docEle.getElementsByTagName("product"); 
                                    for (int i = 0; i < nl.getLength(); i++) {
                                        Node childNode = nl.item(i);
                                              Element eElement = (Element)childNode;

                                            System.out.println("Baslik= "+getTagValue("id", eElement));
                                            System.out.println("Tarih= "+getTagValue("ad", eElement));
                                            System.out.println("Link= "+getTagValue("resim", eElement));

                                productsL.add(new ProductData(Integer.parseInt(getTagValue("id", eElement)),getTagValue("ad", eElement),getTagValue("fiyat", eElement),getTagValue("kisaca", eElement),getTagValue("resim", eElement),Integer.toString(i)));                 

                            }

                                    return productsL;
                }
                }
                catch(MalformedURLException e)
                {

                }
                catch(IOException e)
                {

                }
                catch(ParserConfigurationException e){

                }
                catch(SAXException e)
                {

                }   
            return null;
        }
        public String getTagValue(String tag,Element eElement)
        {
            NodeList nlList = eElement.getElementsByTagName(tag).item(0).getChildNodes();
            Node nValue = (Node) nlList.item(0);
            return nValue.getTextContent();
        }
        protected void onPostExecute(ArrayList<ProductData> result) {

          }

}
}

日志错误:

05-20 05:23:34.460: E/AndroidRuntime(5406): FATAL EXCEPTION: AsyncTask #3
05-20 05:23:34.460: E/AndroidRuntime(5406): java.lang.RuntimeException: An error occured while executing doInBackground()
05-20 05:23:34.460: E/AndroidRuntime(5406):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
05-20 05:23:34.460: E/AndroidRuntime(5406):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
05-20 05:23:34.460: E/AndroidRuntime(5406):     at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
05-20 05:23:34.460: E/AndroidRuntime(5406):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
05-20 05:23:34.460: E/AndroidRuntime(5406):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
05-20 05:23:34.460: E/AndroidRuntime(5406):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
05-20 05:23:34.460: E/AndroidRuntime(5406):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
05-20 05:23:34.460: E/AndroidRuntime(5406):     at java.lang.Thread.run(Thread.java:1019)
05-20 05:23:34.460: E/AndroidRuntime(5406): Caused by: java.lang.NullPointerException
05-20 05:23:34.460: E/AndroidRuntime(5406):     at com.Troyateck.sucukevim.ProductList$Products.getTagValue(ProductList.java:164)
05-20 05:23:34.460: E/AndroidRuntime(5406):     at com.Troyateck.sucukevim.ProductList$Products.doInBackground(ProductList.java:136)
05-20 05:23:34.460: E/AndroidRuntime(5406):     at com.Troyateck.sucukevim.ProductList$Products.doInBackground(ProductList.java:1)
05-20 05:23:34.460: E/AndroidRuntime(5406):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
05-20 05:23:34.460: E/AndroidRuntime(5406):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
05-20 05:23:34.460: E/AndroidRuntime(5406):     ... 4 more
4

1 回答 1

1

问题在于getTagValue()

public String getTagValue(String tag,Element eElement)
{
    NodeList nlList = eElement.getElementsByTagName(tag).item(0).getChildNodes();
    Node nValue = (Node) nlList.item(0);
    return nValue.getTextContent();
}

在第 164 行的某处有一个空指针。我不确定是哪个表达式,但三行中的任何一行都可能导致空指针异常。请在使用前检查每个返回值是否为 null,可能是这样的:

public String getTagValue(String tag,Element eElement)
{
    String retVal = "NOT FOUND";
    if (eElement != null && eElement.getElementsByTagName(tag) != null && eElement.getElementsByTagName(tag).item(0) != null)
    {
        NodeList nlList = eElement.getElementsByTagName(tag).item(0).getChildNodes();
        if (nlList != null && nlList.item(0) != null)
        {
            Node nValue = (Node) nlList.item(0);
            retVal = nValue.getTextContent();
        }
    }

    return retVal;
}
于 2013-05-20T03:27:52.870 回答