JSON字段没有数据,或无法获取相应的数据

时间:2015-01-03 09:50:23

标签: java android json eclipse

我正在为我的android编程学校项目执行此代码,并且我遇到了一个问题,似乎JSON在从它采取的API中检索一些数据时出错。

这是我正在使用的进水应用程序,我正在使用openweathermap.org提供的免费API,同时引用http://code.tutsplus.com/tutorials/create-a-weather-app-on-android--cms-21587中的代码。不同之处在于,我没有使用活动和片段,而是将片段和活动结合在一起并进行了少量修改,以使其可以在Eclipse上运行。

这是我的代码出错:

private void updateWeatherInfo(final String city) {
        new Thread(){
            public void run(){
                final JSONObject json = FetchData.getJSON(MainActivity.this, city);
                if(json == null) {
                    handleWeather.post(new Runnable() {
                        public void run() { 
                            Toast.makeText(MainActivity.this, R.string.place_not_found, Toast.LENGTH_LONG).show();
                        }
                    });
                } 
                else {
                    handleWeather.post(new Runnable() {
                        public void run() {
                            renderWeather(json);
                        }
                    });
                }

        }
    }.start();
}

private void renderWeather(JSONObject json) {
    try {
        cityData.setText(json.getString("name").toUpperCase(Locale.US) + ", " + json.getJSONObject("sys").getString("country"));

        JSONObject details = json.getJSONArray("weather").getJSONObject(0);
        JSONObject main = json.getJSONObject("main");
        detailsData.setText(details.getString("description").toUpperCase(Locale.US) + "\n" + "Humidity: " + main.getString("humidity") + "%" + "\n" + "Pressure: " + main.getString("pressure") + " hPa");

        currentTemperatureData.setText(String.format("%.2f", main.getDouble("temp"))+ " ℃");

        DateFormat df = DateFormat.getDateTimeInstance();
        String updatedOn = df.format(new Date(json.getLong("dt")*1000));
        updatedData.setText("Last update: " + updatedOn);

        getWeatherIcon(details.getInt("id"), json.getJSONObject("sys").getLong("sunrise") * 1000, json.getJSONObject("sys").getLong("sunset") * 1000);

    }
    catch(Exception e) {
        Log.e("SimpleWeather", "One or more fields not found in the JSON data");
    }
}

try / catch的异常一旦到达cityData和detailsData就会发生异常。我知道这一点,因为当我调试它并到达那里时,它会在几步之后直接进入捕获,并且在下次再次将其路由到catch时将注释掉cityData在detailsData。

有人能看出什么是错的并帮我指出来吗?

编辑:这是我使用的API - http://api.openweathermap.org/data/2.5/weather?q=Singapore,sg

EDIT2:似乎是因为我的onCreateView初始化我的textViews是在updateWeatherData之后,我已经在调用updateWeatherData之前将其移动了。但是,现在我意识到我的onCreateView也没有@Override,并且在发出@Override时会发生错误,它必须实现超类型方法。

代码是这样的:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.activity_main, container, false);
        cityData = (TextView)rootView.findViewById(R.id.city_field);
        updatedData = (TextView)rootView.findViewById(R.id.updated_field);
        detailsData = (TextView)rootView.findViewById(R.id.details_field);
        currentTemperatureData = (TextView)rootView.findViewById(R.id.current_temperature_field);
        weatherIcon = (TextView)rootView.findViewById(R.id.weather_icon);

        weatherIcon.setTypeface(weatherIcons);

        return rootView; 
    }

我知道这段代码是针对一个片段的,但是将它实现到一个Activity中似乎我错过了一个修改它的步骤。我该如何从这里开始?

EDIT3:我现在已将onCreateView数据实施到onCreate,因为onCreateViewonCreate的片段版本。但是,我遇到了另一个问题,即问题的范围,因为我的setTypeface返回了NullPointerException。他的代码可以在下面看到:

public class MainActivity extends Activity {

    TextView cityData;
    TextView updatedData;
    TextView detailsData;
    TextView currentTemperatureData;
    TextView weatherIcon;
    Typeface weatherIcons;
    Handler handleWeather;

    public MainActivity() {
        handleWeather = new Handler();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        cityData = (TextView)   findViewById(R.id.city_field);
        updatedData = (TextView) findViewById(R.id.updated_field);
        detailsData = (TextView) findViewById(R.id.details_field);
        currentTemperatureData = (TextView) findViewById(R.id.current_temperature_field);
        weatherIcon = (TextView) findViewById(R.id.weather_icon);

        weatherIcons = Typeface.createFromAsset(getAssets(), "weather.ttf"); 

        weatherIcon.setTypeface(weatherIcons); 

因此,我会继续搜索这个问题一段时间,如果我找到答案,我不会发布另一个问题。但是,我将回答这个问题。

0 个答案:

没有答案