2015-03-12 4 views
-2

Я слежу за новыми сериями андроидов boston и в руководстве по разбору XML, которое стоит перед проблемой. данные не отображаются. Также нет операции, отображаемой при нажатии кнопки на реальном устройстве. код: weatherXMLParsing классДанные Не отображаются из Google Weather API также Тост, не показывающий

package com.ss; 

import java.net.URL; 

import javax.xml.datatype.Duration; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

import org.xml.sax.InputSource; 
import org.xml.sax.XMLReader; 

import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.app.Dialog; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.text.InputFilter.LengthFilter; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

public class WeatherXMLParsing extends Activity implements OnClickListener { 

    static final String baseURL = "http://api.openweathermap.org/data/2.5/weather?q=rajasthan,jaipur&mode=xml"; 
    TextView tvCity, tvState; 
    EditText etCity, etState; 
    Button bWeather; 
    TextView tvWeather; 

    @SuppressLint("NewApi") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.weather); 
     if (android.os.Build.VERSION.SDK_INT > 9) { 
      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
        .permitAll().build(); 
      StrictMode.setThreadPolicy(policy); 
     } 
     tvCity = (TextView) findViewById(R.id.tvCity); 
     tvState = (TextView) findViewById(R.id.tvState); 
     etCity = (EditText) findViewById(R.id.etCity); 
     etState = (EditText) findViewById(R.id.etState); 
     bWeather = (Button) findViewById(R.id.btWeather); 
     tvWeather = (TextView) findViewById(R.id.tvWeather); 
     bWeather.setOnClickListener(this); 

    } 

    @Override 
    public void onClick(View v) { 
     Toast.makeText(WeatherXMLParsing.this, "thanks for pressing",Toast.LENGTH_LONG); 
     String c = etCity.getText().toString(); 
     String s = etState.getText().toString(); 
     // StringBuilder URL = new StringBuilder(baseURL); 
     // URL.append(c+","+s+"&mode=xml"); 

     /* 
     * System.out.print(fullurl +"========"); 
     * System.out.println(URL.toString()); 
     */ 

     try { 
      java.net.URL website = new URL(baseURL); 

      // getting xmlreader for parsing 
      SAXParserFactory spf = SAXParserFactory.newInstance(); 
      SAXParser sp = spf.newSAXParser(); 
      XMLReader xr = sp.getXMLReader(); 
      HandlingXMLStuff doingWork = new HandlingXMLStuff(); 
      xr.setContentHandler(doingWork); 
      xr.parse(new InputSource(website.openStream())); 

      String information = doingWork.getInformation(); 

     } catch (Exception e) { 
      tvWeather.setText("ERROR" + e.toString()); 
      Dialog d = new Dialog(this); 
      d.setTitle("ERROR"+e.toString()); 
      TextView tv = new TextView(this); 
      d.setContentView(tv); 
     } 

    } 

} 

HandliingStuff

package com.ss; 

import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

public class HandlingXMLStuff extends DefaultHandler{ 


    XMLDataCollected info = new XMLDataCollected(); 

    @Override 
    public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException { 
     //super.startElement(uri, localName, qName, attributes); 


     if(localName.equals("city")) 
     { 
      String city = attributes.getValue("name"); 
      info.setCity(city); 

     } 
     else if(localName.equals("temperature")) 
     { 
      String temp = attributes.getValue("value"); 

      info.setTemp(temp); 
     } 
    } 

    public String getInformation() { 
     return info.dataToString(); 
    } 
} 

XMLDataCollected

package com.ss; 

public class XMLDataCollected { 

    String temp = ""; 
    String city = ""; 

    public void setCity(String c) { 
     city = c; 
    } 

    public void setTemp(String tempr) { 
     temp = tempr; 
    } 

    public String dataToString() { 
     return "In "+city +" the current temrature in faranhite is " +temp+" degrees"; 
    } 

} 
+1

downvotes просьба прокомментировать нисходящее сообщение .или ответ, если вы считаете, что это не вопрос –

+0

Здесь много кода, вы можете сузить это до [минимального, полного и проверяемого примера] (http: // stackoverflow .com/help/mcve) –

+0

@ Rick .ok Позвольте мне подвести итог. Получать город и состояние от пользователя. Включение кнопки WeatherXMLParsing класс и разбор его через HandlingXMLStuff.that вы можете видеть, что у него есть метод getInformation .i пытался сделайте это, используя статический xml, но он также не работает. –

ответ

0

Я думаю, вам нужно узнать основные о получении данных с сервера. Используйте asynctask для вызова api.

см это для example

+0

Я следую за новым учебником бостона и тем, что он работает отлично. –

+0

Можете ли вы рассказать мне, где проблема в этом с помощью анализатора SAX –

0

Вам необходимо позвонить setOnClickListener для каждой кнопки. Вы вызываете его только один раз для одной кнопки.

Предлагаю начать с использования тоста или написать длинное сообщение в вашем прослушивателе (-ах), чтобы убедиться, что вы фактически выполняете прослушиватель. Возьмите это, как только программа будет работать.

Fahim также верен. Каждый раз, когда вы получаете доступ к сети, вы должны делать это в фоновом потоке или ваш пользовательский интерфейс закроется. asyncTask is the easiest way to create the background thread you need.

+0

У меня есть только одна кнопка, и я установил для нее. И да, я знаю об использовании aysn task.but для учебника im folling, в котором он сделал без asyn поэтому я пытаюсь это сделать. –