我正在尝试在我的应用中解析一些JSON。我有一个用户在其位置键入的活动,并按下一个按钮,打开另一个活动。问题是打开第二个活动时应用程序崩溃了。我用了一个教程来弄清楚如何获取JSON数据但却无法弄清楚我做错了什么。我对Android开发很陌生,因此非常感谢任何想法或帮助。
这是我的代码:
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
public class WeatherLocation extends Activity
{
EditText locationText;
TextView label;
Button getWeather;
String enteredText;
String url = "http://api.worldweatheronline.com/free/v1/weather.ashx?q=%s&format=json&num_of_days=5&key=37a5fj42xpyptvjgkhrx5rwu";
String newURL;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.weatherlocation);
locationText = (EditText) findViewById(R.id.locationText);
label = (TextView) findViewById(R.id.label);
getWeather = (Button) findViewById(R.id.showWeather);
locationText.setText("Current Location");
locationText.setOnEditorActionListener(new OnEditorActionListener()
{
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
{
boolean handled = false;
if (actionId == EditorInfo.IME_ACTION_DONE)
{
enteredText = locationText.getText().toString();
System.out.println(enteredText);
// hide the virtual keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
InputMethodManager.RESULT_UNCHANGED_SHOWN);
newURL = String.format(url, enteredText);
System.out.println("Formatted URL: " + newURL);
handled = true;
}
return handled;
}
});
getWeather.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Intent weather = new Intent(WeatherLocation.this, Weather.class);
startActivity(weather);
}
});
}
}
天气信息类:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class Weather extends WeatherLocation
{
TextView currentTemp;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.weather);
currentTemp = (TextView) findViewById(R.id.currentTemp);
// Create instance of JSONParser
JSONParser jParser = new JSONParser();
// getting JSON string from URL
System.out.println(newURL);
JSONObject json = jParser.getJSONFromUrl(newURL);
try
{
JSONObject data = new JSONObject(json.getString("data"));
JSONArray currentConditions = data.getJSONArray("current_condition");
JSONArray weather = data.getJSONArray("weather");
JSONObject temp = currentConditions.getJSONObject(0);
String fahr = temp.getString("temp_F");
currentTemp.setText(fahr);
}
catch(Exception e)
{
e.getMessage().toString();
}
}
public static class JSONParser
{
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser()
{
}
public JSONObject getJSONFromUrl(String url)
{
// Making HTTP request
try
{
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
catch (ClientProtocolException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
try
{
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
is.close();
json = sb.toString();
}
catch (Exception e)
{
Log.e("Buffer Error", "Error converting result " + e.toString());
}
// try to parse the string to a JSON object
try
{
jObj = new JSONObject(json);
}
catch (JSONException e)
{
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
}
}
错误:
10-14 13:11:28.523: E/AndroidRuntime(6583): FATAL EXCEPTION: main
10-14 13:11:28.523: E/AndroidRuntime(6583): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kentuckyfarmbureau.kyfb/com.kentuckyfarmbureau.kyfb.Weather}: java.lang.NullPointerException
10-14 13:11:28.523: E/AndroidRuntime(6583): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
10-14 13:11:28.523: E/AndroidRuntime(6583): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
10-14 13:11:28.523: E/AndroidRuntime(6583): at android.app.ActivityThread.access$600(ActivityThread.java:141)
10-14 13:11:28.523: E/AndroidRuntime(6583): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
10-14 13:11:28.523: E/AndroidRuntime(6583): at android.os.Handler.dispatchMessage(Handler.java:99)
10-14 13:11:28.523: E/AndroidRuntime(6583): at android.os.Looper.loop(Looper.java:137)
10-14 13:11:28.523: E/AndroidRuntime(6583): at android.app.ActivityThread.main(ActivityThread.java:5103)
10-14 13:11:28.523: E/AndroidRuntime(6583): at java.lang.reflect.Method.invokeNative(Native Method)
10-14 13:11:28.523: E/AndroidRuntime(6583): at java.lang.reflect.Method.invoke(Method.java:525)
10-14 13:11:28.523: E/AndroidRuntime(6583): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-14 13:11:28.523: E/AndroidRuntime(6583): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-14 13:11:28.523: E/AndroidRuntime(6583): at dalvik.system.NativeStart.main(Native Method)
10-14 13:11:28.523: E/AndroidRuntime(6583): Caused by: java.lang.NullPointerException
10-14 13:11:28.523: E/AndroidRuntime(6583): at com.android.internal.os.LoggingPrintStream.println(LoggingPrintStream.java:298)
10-14 13:11:28.523: E/AndroidRuntime(6583): at com.kentuckyfarmbureau.kyfb.Weather.onCreate(Weather.java:42)
10-14 13:11:28.523: E/AndroidRuntime(6583): at android.app.Activity.performCreate(Activity.java:5133)
10-14 13:11:28.523: E/AndroidRuntime(6583): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-14 13:11:28.523: E/AndroidRuntime(6583): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
10-14 13:11:28.523: E/AndroidRuntime(6583): ... 11 more
编辑: 我已经编辑了Weather.java中的代码(第二个活动),包括:
Intent intent = getIntent();
String url = intent.getStringExtra("INTENT_KEY_URL");
System.out.println(url);
JSONObject json = jParser.getJSONFromUrl(url);
答案 0 :(得分:2)
您正在ui线程上运行与网络相关的操作。
JSONObject json = jParser.getJSONFromUrl(newURL);
在JsonParser中你有
HttpResponse httpResponse = httpClient.execute(httpPost);
使用thread
或AsyncTask
class TheTask extends AsyncTask<Void,Void,Void>
{
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
// get json from url here
getJSONFromUrl(String url);
return null;
}
}
调用new TheTask().execute()
http://developer.android.com/reference/android/os/AsyncTask.html
答案 1 :(得分:0)
首先你必须发送你的&#34; url&#34;第二次活动。要做到这一点,你可以使用Intent与额外的参数
喜欢以下
Intent weather = new Intent(WeatherLocation.this, Weather.class);
weather .putExtra("INTENT_KEY_URL",newURL );
startActivity(weather);
在您的第二个活动中,您可以将URL添加到onCreate方法中,如下所示
Intent intent =getIntent();
String url =intent.getStringExtra("INTENT_KEY_URL");
然后你可以用它来查询你的json数据。
如果您可以发布此错误的堆栈跟踪,那将非常有帮助。