在Android应用程序中获取JSON
我正在尝试解析我的应用程序中的一些JSON。我有一个活动,用户在他们的位置键入,然后按下按钮打开另一个活动。问题是,当打开第二个活动时,应用程序崩溃。我使用了一个教程来找出如何获取JSON数据,但无法找出我做错了什么。我是Android开发的新手,因此非常感谢您的任何想法或帮助 这是我的密码:在Android应用程序中获取JSON,android,json,Android,Json,我正在尝试解析我的应用程序中的一些JSON。我有一个活动,用户在他们的位置键入,然后按下按钮打开另一个活动。问题是,当打开第二个活动时,应用程序崩溃。我使用了一个教程来找出如何获取JSON数据,但无法找出我做错了什么。我是Android开发的新手,因此非常感谢您的任何想法或帮助 这是我的密码: import android.app.Activity; import android.content.Context; import android.content.Intent; import and
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);
您正在ui线程上运行与网络相关的操作
JSONObject json = jParser.getJSONFromUrl(newURL);
在JsonParser中,您有
HttpResponse httpResponse = httpClient.execute(httpPost);
使用线程
或异步任务
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;
}
}
class任务扩展异步任务
{
@凌驾
受保护的void onPostExecute(void结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
}
@凌驾
受保护的Void doInBackground(Void…参数){
//从这里的url获取json
getJSONFromUrl(字符串url);
返回null;
}
}
调用new任务().execute()
首先,您必须将您的“url”发送到第二个活动。为此,您可以使用带有额外参数的Intent 像下面
Intent weather = new Intent(WeatherLocation.this, Weather.class);
weather .putExtra("INTENT_KEY_URL",newURL );
startActivity(weather);
Intent intent =getIntent();
String url =intent.getStringExtra("INTENT_KEY_URL");
在第二个活动中,您可以将URL放入onCreate方法中,如下所示
Intent weather = new Intent(WeatherLocation.this, Weather.class);
weather .putExtra("INTENT_KEY_URL",newURL );
startActivity(weather);
Intent intent =getIntent();
String url =intent.getStringExtra("INTENT_KEY_URL");
然后您可以使用它来查询json数据
如果您可以发布此错误的堆栈跟踪信息,这将非常有帮助。将堆栈跟踪信息发布到此处错误已添加。第42行Weather.javaSystem.out.println(newURL);您没有在
Weather.java
中初始化newURL
。您需要有打印语句的url,并使用Log
而不是System.out.println(newURL)
来获得NPE