我正在为我的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
,因为onCreateView
是onCreate
的片段版本。但是,我遇到了另一个问题,即问题的范围,因为我的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);
因此,我会继续搜索这个问题一段时间,如果我找到答案,我不会发布另一个问题。但是,我将回答这个问题。