异步任务出错

时间:2013-05-20 03:14:43

标签: java android android-asynctask custom-adapter

我在Android中收到关于Asynctask的错误我想用它来通过网络服务获取数据并将它们绑定在网格视图上

    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) {

          }

}
}

Logcat错误:

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

1 个答案:

答案 0 :(得分: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;
}