2014-02-20 65 views
-1

我正在嘗試將RSS FEED的天氣& & psi放入我的應用程序中。 他們分別來自雅虎天氣和nea.gov.sg。無效指數0,對於RSS大小爲0 FEED

但是,當我運行該應用程序時,出現強制關閉錯誤。看過logcat後,顯示無效索引0,大小爲0.有人可以告訴我這個錯誤有什麼問題,我該如何解決? 我正在嘗試使用rss提要。

logcat的

02-20 22:11:50.906: E/AndroidRuntime(12108): FATAL EXCEPTION: main 
02-20 22:11:50.906: E/AndroidRuntime(12108): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fuellogproject/com.example.fuellogproject.HomeActivity}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
02-20 22:11:50.906: E/AndroidRuntime(12108): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at android.app.ActivityThread.access$700(ActivityThread.java:140) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at android.os.Looper.loop(Looper.java:137) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at android.app.ActivityThread.main(ActivityThread.java:4921) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at java.lang.reflect.Method.invokeNative(Native Method) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at java.lang.reflect.Method.invoke(Method.java:511) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at dalvik.system.NativeStart.main(Native Method) 
02-20 22:11:50.906: E/AndroidRuntime(12108): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
02-20 22:11:50.906: E/AndroidRuntime(12108): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at java.util.ArrayList.get(ArrayList.java:304) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at com.example.fuellogproject.HomeActivity.onCreate(HomeActivity.java:135) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at android.app.Activity.performCreate(Activity.java:5188) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
02-20 22:11:50.906: E/AndroidRuntime(12108): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074) 
02-20 22:11:50.906: E/AndroidRuntime(12108): ... 11 more 

CODE

public class HomeActivity extends Activity{ 

    Button btnLogIn; 

    Button btnExit; 
    TextView name; 
    final Context context = this; 
    Session session; 


    //WEATHERVAR 
    ArrayList<String> psi; 

     public TextView psi_text; 

    TextView weather; 
    ImageView image; 
    private static Handler mHandler = new Handler(); 
    class MyWeather{ 


     String conditiontext; 
     String conditiontemp; 
     String conditiondate; 



     public String forecastToString(){ 

     return 
       "  " + conditiontemp + "°C" ; 

     } 
    } 


    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.homescreen); 
     weather = (TextView)findViewById(R.id.weather); 
      image = (ImageView)findViewById(R.id.image); 
      psi = new ArrayList<String>(); 
      psi_text = (TextView) findViewById(R.id.psi_text); 
     session = new Session(getApplicationContext()); 
     session.checkLogin(); 
     Log.i("HomeActivity.java", "User login status: " + session.isLoggedIn()); 
     name = (TextView) findViewById(R.id.name);   
     Bundle extras = getIntent().getExtras(); 

     HashMap<String, String> user = session.getUserDetails(); 
     String username = user.get(Session.KEY_NAME); 
     name.setText(username); 
     btnLogIn = (Button) findViewById(R.id.buttonLogIn); 
      btnExit=(Button) findViewById(R.id.buttonExit); 
      btnExit.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 

        finish(); 
       } 
      }); 

      try { 

       URL url = new URL(
         "http://app2.nea.gov.sg/data/rss/nea_psi.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"); 
       for (int i = 0; i < nodeList.getLength(); i++) { 

        Node node = nodeList.item(i);  

        Element fstElmnt = (Element) node;     

        NodeList websiteList = fstElmnt.getElementsByTagName("psi"); 
        Element websiteElement = (Element) websiteList.item(0); 
        websiteList = websiteElement.getChildNodes(); 

        psi.add(""+ ((Node) websiteList.item(0)).getNodeValue());   

       } 
      } catch (Exception e) { 
       System.out.println("XML Pasing Excpetion = " + e); 
      } 



      String temp = Html.fromHtml(psi.get(0)).toString(); 
      String a[] = temp.split("\\)"); 
      psi_text.setText(""+a[0]+")"); 


      Thread myThread = new Thread(new Runnable(){ 

       @Override 
        public void run() { 
        String weatherString = QueryYahooWeather(); 
          Document weatherDoc = convertStringToDocument(weatherString); 

          final MyWeather weatherResult = parseWeather(weatherDoc); 
          runOnUiThread(new Runnable(){ 

           @Override 
           public void run() { 
            weather.setText(weatherResult.forecastToString()); 
           }}); 

           }}); 
            myThread.start(); 
           } 




    public void CheckUser(View v) 

    { 
      Intent intentAbout=new Intent(getApplicationContext(),MainActivity.class); 
      startActivity(intentAbout); 
    } 


    protected void onDestroy() { 

     super.onDestroy(); 
    } 

    @Override 
    protected void onPause() { 

     super.onPause(); 
    } 

    @Override 
    protected void onRestart() { 

     super.onRestart(); 
    } 

    @Override 
    protected void onResume() { 

     super.onResume(); 

    } 

    @Override 
    protected void onStart() { 

     super.onStart(); 
    } 

    @Override 
    protected void onStop() { 

     super.onStop(); 
    } 

    private MyWeather parseWeather(Document srcDoc){ 

     MyWeather myWeather = new MyWeather(); 

      //<yweather:condition.../> 
     Node conditionNode = srcDoc.getElementsByTagName("yweather:condition").item(0); 


     String weatherCode = conditionNode.getAttributes() 
       .getNamedItem("code") 
       .getNodeValue() 
       .toString(); 

     // thunderstorms 
     if(weatherCode.equals("4")){ 

      mHandler.post(new Runnable() { 
       @Override 
       public void run() { 
        // This gets executed on the UI thread so it can safely modify 
        // Views 

        image.setImageResource(R.drawable.thunderstorm); 
       } 
      }); 
     } 

     //isolated thunderstorms 
     else if (weatherCode.equals("37")) { 
        mHandler.post(new Runnable() { 
         @Override 
         public void run() { 

          image.setImageResource(R.drawable.thunderstorm); 
         } 
        }); 
       } 


     //scattered thunderstorms 
     else if (weatherCode.equals("38")) { 
        mHandler.post(new Runnable() { 
         @Override 
         public void run() { 

          image.setImageResource(R.drawable.thunderstorm); 
         } 
        }); 
       } 

     //scattered thunderstorms 
     else if (weatherCode.equals("39")) { 
        mHandler.post(new Runnable() { 
         @Override 
         public void run() { 

          image.setImageResource(R.drawable.thunderstorm); 
         } 
        }); 
       } 

     //thundershowers 
     else if (weatherCode.equals("45")) { 
        mHandler.post(new Runnable() { 
         @Override 
         public void run() { 

          image.setImageResource(R.drawable.thunderstorm); 
         } 
        }); 
       } 

     //isolated thundershowers 
     else if (weatherCode.equals("47")) { 
        mHandler.post(new Runnable() { 
         @Override 
         public void run() { 

          image.setImageResource(R.drawable.thunderstorm); 
         } 
        }); 
       } 

     //drizzle 
     else if (weatherCode.equals("9")) { 
        mHandler.post(new Runnable() { 
         @Override 
         public void run() { 

          image.setImageResource(R.drawable.rainy); 
         } 
        }); 
       } 

     //showers 
     else if (weatherCode.equals("11")) { 
        mHandler.post(new Runnable() { 
         @Override 
         public void run() { 

          image.setImageResource(R.drawable.rainy); 
         } 
        }); 
       } 

//showers 
else if (weatherCode.equals("12")) { 
mHandler.post(new Runnable() { 
    @Override 
    public void run() { 

     image.setImageResource(R.drawable.rainy); 
    } 
}); 
} 

     //scattered showers 
else if (weatherCode.equals("40")) { 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 

       image.setImageResource(R.drawable.rainy); 
      } 
     }); 
    } 

     //hail 
else if (weatherCode.equals("17")) { 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 

       image.setImageResource(R.drawable.hail); 
      } 
     }); 
    } 


     //mixed rain and hail 
else if (weatherCode.equals("35")) { 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 

       image.setImageResource(R.drawable.hail); 
      } 
     }); 
    } 

     //foggy 
else if (weatherCode.equals("20")) { 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 

       image.setImageResource(R.drawable.foggy); 
      } 
     }); 
    } 

     //haze 
else if (weatherCode.equals("21")) { 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 

       image.setImageResource(R.drawable.foggy); 
      } 
     }); 
    } 

     //smoky 
else if (weatherCode.equals("22")) { 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 

       image.setImageResource(R.drawable.foggy); 
      } 
     }); 
    } 

     //windy 
else if (weatherCode.equals("24")) { 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 

       image.setImageResource(R.drawable.windy); 
      } 
     }); 
    } 

     //cloudy 
else if (weatherCode.equals("26")) { 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 

       image.setImageResource(R.drawable.cloudy); 
      } 
     }); 
    } 

     //fair (night) 
else if (weatherCode.equals("33")) { 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 

       image.setImageResource(R.drawable.cloudy); 
      } 
     }); 
    } 

     //fair (day) 
else if (weatherCode.equals("34")) { 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 

       image.setImageResource(R.drawable.cloudy); 
      } 
     }); 
    } 

     //partly cloudy 
else if (weatherCode.equals("44")) { 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 

       image.setImageResource(R.drawable.cloudy); 
      } 
     }); 
    } 

     //mostly cloudy (night) 
else if (weatherCode.equals("27")) { 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 

       image.setImageResource(R.drawable.night_cloudy); 
      } 
     }); 
    } 

     //partly cloudy (night) 
else if (weatherCode.equals("29")) { 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 

       image.setImageResource(R.drawable.night_cloudy); 
      } 
     }); 
    } 

     //mostly cloudy (day) 
else if (weatherCode.equals("28")) { 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 

       image.setImageResource(R.drawable.day_cloudy); 
      } 
     }); 
    } 


     //partly cloudy (day) 
    else if (weatherCode.equals("30")) { 
      mHandler.post(new Runnable() { 
       @Override 
       public void run() { 

        image.setImageResource(R.drawable.day_cloudy); 
       } 
      }); 
     } 




     //clear(night) 
    else if (weatherCode.equals("31")) { 
      mHandler.post(new Runnable() { 
       @Override 
       public void run() { 

        image.setImageResource(R.drawable.moon); 
       } 
      }); 
     } 


     //sunny 
    else { 
      mHandler.post(new Runnable() { 
       @Override 
       public void run() { 

        image.setImageResource(R.drawable.sunny); 
       } 
      }); 
     } 




     myWeather.conditiontext = conditionNode.getAttributes() 
    .getNamedItem("text") 
    .getNodeValue() 
    .toString(); 

     myWeather.conditiontemp = conditionNode.getAttributes() 
        .getNamedItem("temp") 
        .getNodeValue() 
        .toString(); 




    return myWeather; 
} 

private Document convertStringToDocument(String src){ 

    Document dest = null; 
    DocumentBuilderFactory dbFactory = 
    DocumentBuilderFactory.newInstance(); 
    DocumentBuilder parser; 

    try { 
    parser = dbFactory.newDocumentBuilder(); 
    dest = parser.parse(new ByteArrayInputStream(src.getBytes())); 
    } catch (ParserConfigurationException e1) { 
    e1.printStackTrace(); 
    Toast.makeText(HomeActivity.this, 
    e1.toString(), Toast.LENGTH_LONG).show(); 
    } catch (SAXException e) { 
    e.printStackTrace(); 
    Toast.makeText(HomeActivity.this, 
    e.toString(), Toast.LENGTH_LONG).show(); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    Toast.makeText(HomeActivity.this, 
    e.toString(), Toast.LENGTH_LONG).show(); 
    } 

    return dest; 
} 

private String QueryYahooWeather(){ 

    String qResult = ""; 
    String queryString = "http://weather.yahooapis.com/forecastrss?w=1062617&u=c"; 

    HttpClient httpClient = new DefaultHttpClient(); 
    HttpGet httpGet = new HttpGet(queryString); 

    try { 
    HttpEntity httpEntity = httpClient.execute(httpGet).getEntity(); 

    if (httpEntity != null){ 
    InputStream inputStream = httpEntity.getContent(); 
    Reader in = new InputStreamReader(inputStream); 
    BufferedReader bufferedreader = new BufferedReader(in); 
    StringBuilder stringBuilder = new StringBuilder(); 

    String stringReadLine = null; 

    while ((stringReadLine = bufferedreader.readLine()) != null) { 
    stringBuilder.append(stringReadLine + "\n"); 
    } 

    qResult = stringBuilder.toString(); 
    } 
    } catch (ClientProtocolException e) { 
    e.printStackTrace(); 
    Toast.makeText(HomeActivity.this, 
    e.toString(), Toast.LENGTH_LONG).show(); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    Toast.makeText(HomeActivity.this, 
    e.toString(), Toast.LENGTH_LONG).show(); 
    } 

    return qResult; 
} 


} 

回答

0

線135,你應該檢查一下psi.get(0)爲null。也許嘗試執行它爲:

if (psi.get(0).length() != 0){ 
    String temp = Html.fromHtml(psi.get(0)).toString(); 
} else { 
    String temp = "";} 
相關問題