Android-从url获取JSON时出错
我为我的移动应用程序编写了一个API。它位于上,并以JSON格式返回数据。我想写一个登录方法,但当我的应用程序应该询问API时,我得到了一个错误,我不知道是什么原因导致了这个错误 这是我的登录功能的一部分:Android-从url获取JSON时出错,android,runtime-error,getjson,Android,Runtime Error,Getjson,我为我的移动应用程序编写了一个API。它位于上,并以JSON格式返回数据。我想写一个登录方法,但当我的应用程序应该询问API时,我得到了一个错误,我不知道是什么原因导致了这个错误 这是我的登录功能的一部分: public static String logIn(String nick, String password) { Log.e("2", "1"); //added by me to debug JSONParser jParser = new JS
public static String logIn(String nick, String password)
{
Log.e("2", "1"); //added by me to debug
JSONParser jParser = new JSONParser();
Log.e("2", "2"); //added by me to debug
Log.wtf("Error !", "http://tymonradzik.pl/THUNDER_HUNTER/thapi.php?q=login&username=" + nick + "&password=" + password + "&imei=");
String json = jParser.getJSONFromUrl("http://tymonradzik.pl/THUNDER_HUNTER/thapi.php?q=login&username=" + nick + "&password=" + haslo + "&imei=");
Log.e("2", "3");
Log.e("aaa",json.toString());
JSONObject jObject;
try {
jObject = new JSONObject(json); //That is crash line !
String error = jObject.getString("error");
Log.e("ADSFDSFSDF", error);
} catch (JSONException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Log.e("2", "3");
我的JSONParser类:
package com.radzik.thunter;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.json.JSONObject;
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
public String getJSONFromUrl(String url) {
DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
HttpPost httppost = new HttpPost(url);
// Depends on your web service
httppost.setHeader("Content-type", "application/json");
InputStream inputStream = null;
String result = null;
try {
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
inputStream = entity.getContent();
// json is UTF-8 by default
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
result = sb.toString();
} catch (Exception e) {
// Oops
}
finally {
try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
}
return result;
}
}
我的日志:
07-24 13:11:08.440: E/2(18212): 1
07-24 13:11:08.440: E/2(18212): 2
07-24 13:11:08.440: A/Error !(18212): http://tymonradzik.pl/THUNDER_HUNTER/thapi.php?q=login&username=aaa&password=bbb&imei=
07-24 13:11:08.475: D/AndroidRuntime(18212): Shutting down VM
07-24 13:11:08.480: W/dalvikvm(18212): threadid=1: thread exiting with uncaught exception (group=0x414e92a0)
07-24 13:11:08.485: E/AndroidRuntime(18212): FATAL EXCEPTION: main
07-24 13:11:08.485: E/AndroidRuntime(18212): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.radzik.thunter/com.radzik.thunter.ThunderHunter}: java.lang.NullPointerException
07-24 13:11:08.485: E/AndroidRuntime(18212): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
07-24 13:11:08.485: E/AndroidRuntime(18212): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
07-24 13:11:08.485: E/AndroidRuntime(18212): at android.app.ActivityThread.access$600(ActivityThread.java:140)
07-24 13:11:08.485: E/AndroidRuntime(18212): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
07-24 13:11:08.485: E/AndroidRuntime(18212): at android.os.Handler.dispatchMessage(Handler.java:99)
07-24 13:11:08.485: E/AndroidRuntime(18212): at android.os.Looper.loop(Looper.java:137)
07-24 13:11:08.485: E/AndroidRuntime(18212): at android.app.ActivityThread.main(ActivityThread.java:4898)
07-24 13:11:08.485: E/AndroidRuntime(18212): at java.lang.reflect.Method.invokeNative(Native Method)
07-24 13:11:08.485: E/AndroidRuntime(18212): at java.lang.reflect.Method.invoke(Method.java:511)
07-24 13:11:08.485: E/AndroidRuntime(18212): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
07-24 13:11:08.485: E/AndroidRuntime(18212): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
07-24 13:11:08.485: E/AndroidRuntime(18212): at dalvik.system.NativeStart.main(Native Method)
07-24 13:11:08.485: E/AndroidRuntime(18212): Caused by: java.lang.NullPointerException
07-24 13:11:08.485: E/AndroidRuntime(18212): at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
07-24 13:11:08.485: E/AndroidRuntime(18212): at org.json.JSONTokener.nextValue(JSONTokener.java:94)
07-24 13:11:08.485: E/AndroidRuntime(18212): at org.json.JSONObject.<init>(JSONObject.java:154)
07-24 13:11:08.485: E/AndroidRuntime(18212): at org.json.JSONObject.<init>(JSONObject.java:171)
07-24 13:11:08.485: E/AndroidRuntime(18212): at com.radzik.thunter.FunkcjeAPI.zalogujSie(FunkcjeAPI.java:20)
07-24 13:11:08.485: E/AndroidRuntime(18212): at com.radzik.thunter.ThunderHunter.onCreate(ThunderHunter.java:30)
07-24 13:11:08.485: E/AndroidRuntime(18212): at android.app.Activity.performCreate(Activity.java:5206)
07-24 13:11:08.485: E/AndroidRuntime(18212): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083)
07-24 13:11:08.485: E/AndroidRuntime(18212): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
07-24 13:11:08.485: E/AndroidRuntime(18212): ... 11 more
使用James Holderness回答的NullPointerException:
07-26 16:42:41.665: E/AndroidRuntime(345): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.radzik.thunter/com.radzik.thunter.ThunderHunter}: java.lang.NullPointerException: println needs a message
07-26 16:42:41.665: E/AndroidRuntime(345): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
07-26 16:42:41.665: E/AndroidRuntime(345): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
07-26 16:42:41.665: E/AndroidRuntime(345): at android.app.ActivityThread.access$600(ActivityThread.java:140)
07-26 16:42:41.665: E/AndroidRuntime(345): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
07-26 16:42:41.665: E/AndroidRuntime(345): at android.os.Handler.dispatchMessage(Handler.java:99)
07-26 16:42:41.665: E/AndroidRuntime(345): at android.os.Looper.loop(Looper.java:137)
07-26 16:42:41.665: E/AndroidRuntime(345): at android.app.ActivityThread.main(ActivityThread.java:4898)
07-26 16:42:41.665: E/AndroidRuntime(345): at java.lang.reflect.Method.invokeNative(Native Method)
07-26 16:42:41.665: E/AndroidRuntime(345): at java.lang.reflect.Method.invoke(Method.java:511)
07-26 16:42:41.665: E/AndroidRuntime(345): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
07-26 16:42:41.665: E/AndroidRuntime(345): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
07-26 16:42:41.665: E/AndroidRuntime(345): at dalvik.system.NativeStart.main(Native Method)
07-26 16:42:41.665: E/AndroidRuntime(345): Caused by: java.lang.NullPointerException: println needs a message
07-26 16:42:41.665: E/AndroidRuntime(345): at android.util.Log.println_native(Native Method)
07-26 16:42:41.665: E/AndroidRuntime(345): at android.util.Log.e(Log.java:297)
07-26 16:42:41.665: E/AndroidRuntime(345): at com.radzik.thunter.FunkcjeAPI.zalogujSie(FunkcjeAPI.java:19)
07-26 16:42:41.665: E/AndroidRuntime(345): at com.radzik.thunter.ThunderHunter.onCreate(ThunderHunter.java:30)
07-26 16:42:41.665: E/AndroidRuntime(345): at android.app.Activity.performCreate(Activity.java:5206)
07-26 16:42:41.665: E/AndroidRuntime(345): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083)
07-26 16:42:41.665: E/AndroidRuntime(345): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
07-26 16:42:41.665: E/AndroidRuntime(345): ... 11 more
客户:
import com.google.gson.Gson;
private static final String LOG = "Login layout";
private static final String URL = "xxx";
@SuppressWarnings("unused")
@Override
public void onClick(View view) {
Resources standardResources = getApplicationContext().getResources();
AssetManager assets = standardResources.getAssets();
DisplayMetrics metrics = standardResources.getDisplayMetrics();
Configuration config = new Configuration(standardResources.getConfiguration());
Resources defaultResources;
int id = view.getId();
if (id == R.id.btnCheck) {
if (isNetworkAvailable()) {
try {
if (!login.getText().toString().equals("")
&& !password.getText().toString().equals("")) {
HttpComunication task = new HttpComunication();
task.login(login.getText().toString(), password
.getText().toString(), false);
task.execute(new String[] { URL });
if (!task.get().equals("0")) {
Log.i(LOG, task.get());
Profile profile = new Gson().fromJson(task.get(),
Profile.class);
Intent intent = new Intent(getApplicationContext(),
StopPointsActivity.class);
intent.putExtra("PROFILE", profile);
intent.putExtra("LOGIN", login.getText().toString());
intent.putExtra("PASS", password.getText()
.toString());
startActivity(intent);
finish();
} else {
Toast.makeText(
getApplicationContext(),
getResources().getString(
R.string.incorect_data),
Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(getApplicationContext(),
getResources().getString(R.string.empty_data),
Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Log.e(LOG, e.toString());
}
} else {
Toast.makeText(getApplicationContext(),
getResources().getString(R.string.error_connection),
Toast.LENGTH_LONG).show();
}
}
}
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
}
public class HttpComunication extends AsyncTask<String, Void, String> {
private String login;
private String password;
private boolean isLoged;
private String logReport;
private String start;
private String stop;
public void login(String _login, String _password, boolean _isLoged) {
this.login = _login;
this.password = _password;
if (_isLoged) {
logReport = "yes";
} else {
logReport = "no";
}
this.isLoged = _isLoged;
}
public void getPath(String _start, String _stop) {
this.start = _start;
this.stop = _stop;
}
@Override
protected String doInBackground(String... urls) {
String output = null;
if (!isLoged) {
for (String url : urls) {
output = loginToSystem(url);
}
} else {
for (String url : urls) {
output = getSchedules(url);
}
}
return output;
}
private String loginToSystem(String url) {
String output = null;
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
postParameters.add(new BasicNameValuePair("username", login));
postParameters.add(new BasicNameValuePair("password", password));
postParameters.add(new BasicNameValuePair("loged", logReport));
httpPost.setEntity(new UrlEncodedFormEntity(postParameters));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
output = EntityUtils.toString(httpEntity);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return output;
}
private String getSchedules(String url) {
String output = null;
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
postParameters.add(new BasicNameValuePair("username", login));
postParameters.add(new BasicNameValuePair("password", password));
postParameters.add(new BasicNameValuePair("loged", logReport));
postParameters.add(new BasicNameValuePair("start", start));
postParameters.add(new BasicNameValuePair("stop", stop));
httpPost.setEntity(new UrlEncodedFormEntity(postParameters));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
output = EntityUtils.toString(httpEntity);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return output;
}
@Override
protected void onPostExecute(String output) {
}
检查人:
private static String localLogin = "Dragy";
private static String localPassword = "qwe";
protected static boolean comfirmData(String userName, String password) {
if (userName.equals(localLogin) && password.equals(localPassword)) {
fillDataForUser();
return true;
} else {
return false;
}
}
在我看来,您正在向服务器发送POST请求,该服务器正在等待GET。除此之外,您的POST请求设置了一个内容类型头,但您实际上没有提供任何内容 我预计这会导致请求失败,从而导致异常(您将忽略该异常)。这意味着从getJSONFromUrl返回的结果字符串为null,这最终会导致JSON解析器中出现null指针异常 另外,为什么要用空的BasicHttpParams对象覆盖默认HTTP参数?如果不使用该参数,客户端将使用默认HTTP参数初始化,这似乎是一个更合理的选项 您可以将POST请求转换为GET请求,并通过如下方式替换getJSONFromUrl的前几行来摆脱BasicHttpParams:
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
InputStream inputStream = null;
String result = null;
try {
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
...
如果这不起作用,请在异常处理程序中添加一些日志记录,以查看导致请求失败的原因。崩溃位于
com.radzik.thunter.FunkcjeAPI.zalogujSie(FunkcjeAPI.java:20)
。FunkcjeAPI表示APIFunctions(我翻译了变量名)。zalogujSie意味着登录(我还翻译了函数名)。我添加了崩溃行我想说的是,您的stacktrace似乎没有进入getJSONFromUrl
。我猜错误发生在调用getJSONFromUrl
之后。第20行到底是什么?我在尝试解析json并检查它是否正确之前添加了informationlog。在getJSONFromUrl
中添加e.printStrackTrace而不是//Oops
。我猜它在这里崩溃了,但你放弃了异常,然后返回null。jak może mi to pomóc(这怎么能帮助我呢?)开玩笑说praktycznie cały program do poączenia miedzy serwerem a aplikacja na androidzie przy użyciu jsona,mo esz porównaćco I jak bo mnie dzia bez zarzutów:)dzia kod,na pewno siebie,leci+1现在我也得到了NullPointerException,但另一个(粘贴在我的问题中)异常出现在您的Log.e
调用中(在FunkcjeAPI.java第19行的FunkcjeAPI.zalogujSie中)。是的,我知道。我想因为json是空的(null),它是哪一行?如果是Log.e(“ADSFDSFSDF”,错误)代码>那么json不是空的-它只是没有“error”值。您是否尝试记录json字符串。我在代码中添加了新行,它正在崩溃:Log.e(“aaa”,json.toString())代码>
private static String localLogin = "Dragy";
private static String localPassword = "qwe";
protected static boolean comfirmData(String userName, String password) {
if (userName.equals(localLogin) && password.equals(localPassword)) {
fillDataForUser();
return true;
} else {
return false;
}
}
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
InputStream inputStream = null;
String result = null;
try {
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
...