【发布时间】:2018-02-05 17:27:16
【问题描述】:
我正在构建一个 android 应用程序,每当我向我的服务器发送一个 get 请求时,它都会返回 Json,例如:
{
"status":"error",
"error":"Username already exists."
}
或者当用户不存在时,电子邮件也不存在:
{
"status":"ok",
"cookie":"test16|1519060288|Jf8jEzJe8C7JJWmAxW6ViJbLKgsY1XuCH0OStT38vG2|d6489d623438870a08da717cc6f1851496c2e1e7c45557da7c8df8d1f80f1db4",
"user_id":285
}
问题是,对于第二个 Json,一切正常,用户收到一封电子邮件,应用程序按其应有的方式运行。
但是当您尝试使用现有用户名注册时,一切都会崩溃,
从我的 logcat 中,我发现它在 BufferReader 声明行或这一行中崩溃:if (responseCode == HttpsURLConnection.HTTP_OK),如果我选择包含它。
到底是什么原因可能是我的代码接受了"status" = "ok" 的一种 Json,而不是当它等于“错误”时?
这是我的异步任务:
public class Register extends AsyncTask<String, Void, RegisterData> {
@Override
protected void onPreExecute() {
p= ProgressDialog.show(SignUpActivity.this,getString(R.string.Authenticating),getString(R.string.loadingPleaseWait),true);
p.setCancelable(true);
p.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
p.setMessage(getString(R.string.loadingDotDotDot));
p.show();
}
@Override
protected RegisterData doInBackground(String... params)
{
String str=params[0];
String res=performPostCall(str);
Log.d("ress", res);
if (Response.matches(""))
{
register.cancel(true);
}
RegisterData regi = null;
try
{
JSONObject json_data = new JSONObject(res);
String Status = json_data.getString("status");
String error = "null";
if (Status.equals("ok"))
error = "null";
else
error= json_data.getString("error");
Log.d("coo", error);
regi= new RegisterData(Status,error);
Log.d("stat", regi.getStatus());
}
catch(JSONException e)
{
}
Log.d("aa", res);
return regi;
}
@Override
protected void onPostExecute(RegisterData result) {
Log.d("stat2", result.getStatus());
if (result.getStatus().equals("ok")) {
check = true;
Toast.makeText(SignUpActivity.this, R.string.SuccessfulLogin, Toast.LENGTH_LONG).show();
finish();
}
else
{
check = false;
Toast.makeText(SignUpActivity.this, R.string.WrongUserOrPass, Toast.LENGTH_LONG).show();
}
p.dismiss();
}
}
这是执行 http 请求的类:
public String performPostCall(String requestURL) {
URL url;
Log.d("nugi", "Got Here 1");
String response = "";
try {
String str=getPostDataString();
Log.d("nugi", "Got Here 2");
url = new URL(requestURL+str);
Log.d("nugi", url.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setDoOutput(true);
int responseCode=conn.getResponseCode();
if (responseCode == HttpsURLConnection.HTTP_OK) {
Log.d("nugi", "Got Here 3");
String line;
BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream(), "iso-8859-1"));
Log.d("nugi", "Got Here 4");
while ((line=br.readLine()) != null) {
response+=line;
Log.d("nugi", "Got Here 5");
}
Log.d("nugi", response);
Response = response;
}
/*else {
response="";
Response = response;
}*/
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
这是我的 logcat 错误:
02-05 17:24:28.075 5378-5394/com.example.negev.peulibraryv201 E/Surface:getSlotFromBufferLocked:未知缓冲区:0xab38aea0 02-05 17:24:28.082 5378-5394/com.example.negev.peulibraryv201 E/Surface:getSlotFromBufferLocked:未知缓冲区:0xab38a5e0 02-05 17:24:28.332 5378-5378/com.example.negev.peulibraryv201 E/WindowManager: android.view.WindowLeaked: Activity com.example.negev.peulibraryv201.SignUpActivity 已泄露窗口 com.android.internal.policy。 PhoneWindow$DecorView{bd0880e V.E...... R......D 0,0-729,322} 最初添加在这里 在 android.view.ViewRootImpl.(ViewRootImpl.java:368) 在 android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:299) 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85) 在 android.app.Dialog.show(Dialog.java:319) 在 android.app.ProgressDialog.show(ProgressDialog.java:116) 在 android.app.ProgressDialog.show(ProgressDialog.java:99) 在 com.example.negev.peulibraryv201.SignUpActivity$Register.onPreExecute(SignUpActivity.java:156) 在 android.os.AsyncTask.executeOnExecutor(AsyncTask.java:604) 在 android.os.AsyncTask.execute(AsyncTask.java:551) 在 com.example.negev.peulibraryv201.SignUpActivity.onClick(SignUpActivity.java:87) 在 android.view.View.performClick(View.java:5198) 在 android.view.View$PerformClick.run(View.java:21147) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
谢谢!
【问题讨论】:
-
问题不是 Json 而是你的 Dialog。当您遇到错误时,您会尝试将其关闭
-
什么意思?在哪里?并且不应该有任何错误 Json 应该始终写入 BufferReader 不是吗?谢谢!
-
你的错误是
E/WindowManager: android.view.WindowLeaked: Activity com.example.negev.peulibraryv201.SignUpActivity has leaked window -
@Eselfar 当您的应用在到达驳回线之前崩溃时也会发生这种情况。所以这里可能发生的是,应用程序由于其他问题而崩溃,可能是
NullPointer& 窗口被泄露。这就是为什么我要求 OP 检查 responseCode 以防出现错误和其他错误的日志
标签: java android android-studio