Android:从 doInBackground 返回简单字符串时出现奇怪错误
Android : Strange error when returning a simple string from doInBackground
这是有问题的 doInBackground 代码:-
@Override
protected String doInBackground(Void... params) {
try {
jsonArray = LoadCacheAction();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject obj = jsonArray.getJSONObject(i);
HttpResponse httpResponse = httpResponse = ((Globals) getApplication()).SendDataApache("employeeactions", obj);;
if (httpResponse != null) {
int code = httpResponse.getStatusLine().getStatusCode();
if ((code == 200) || (code == 201)){
return "ok";
}
else if ((code == 400)){
((Globals) getApplication()).WriteEventLogCache(((Globals) getApplication()).TodaysDate(), "3", "1", ((Globals) getApplication()).getIdUser(), "400 - Bad request error - Clocking Action");
return code + "";
}
else
return code + "";
}
}
((Globals) getApplication()).WriteEventLogCache(((Globals) getApplication()).TodaysDate(), "3", "1", ((Globals) getApplication()).getIdUser(), "Just Testing");
return "error";
} catch (Exception e) {
((Globals) getApplication()).WriteEventLogCache(((Globals) getApplication()).TodaysDate(), "3", "1", ((Globals) getApplication()).getIdUser(), e.getMessage());
return "conIssue";
}
}
整个软件包在遇到 return 中的任何一个之前都能完美运行。当它这样做时,软件会完全崩溃。我试过删除方法中的所有内容,只是 return "ok" 但它仍然崩溃。
有没有人有任何建议,为什么因为我真的根本看不到它。
谢谢
史蒂夫
PostExecute 代码:-
protected void onPostExecute(String result) {
if (pDialog.isShowing())
pDialog.dismiss();
if (result == "ok") {
((Globals) getApplication()).ClearCacheFile(((Globals) getApplication()).getActionCacheFileName());
} else {
if (result == "error") {
Toast.makeText(getApplicationContext(),
"Clocking Error. Try Again !!!", Toast.LENGTH_LONG)
.show();
} else {
if (result == "conIssue") {
Toast.makeText(
getApplicationContext(),
"Server not connected. Data will be updated when connection will be available.",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(
getApplicationContext(),
"Clocking Error. Server connection problem !!!",
Toast.LENGTH_LONG).show();
}
}
}
}
这是崩溃发生时日志中显示的内容:-
08-28 09:19:28.271 22411-22411/com.pe_systems.unity.unityandroid E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.pe_systems.unity.unityandroid, PID: 22411
java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{246c3ec6 V.E..... R......D 0,0-959,128} not attached to window manager
at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:396)
at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:322)
at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:116)
at android.app.Dialog.dismissDialog(Dialog.java:341)
at android.app.Dialog.dismiss(Dialog.java:324)
at com.pe_systems.unity.unityandroid.Clocking.ClockingActivity$ServerConnectionTask.onPostExecute(ClockingActivity.java:408)
at com.pe_systems.unity.unityandroid.Clocking.ClockingActivity$ServerConnectionTask.onPostExecute(ClockingActivity.java:357)
at android.os.AsyncTask.finish(AsyncTask.java:636)
at android.os.AsyncTask.access0(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
08-28 09:19:28.272 546-3362/? W/ActivityManager﹕强制整理activity 1 com.pe_systems.unity.unityandroid/.Main.MainActivity
08-2809:19:28.348 546-603/? I/OpenGLRenderer﹕初始化EGL,版本1.4
ClearCaheFile 代码:-
public void ClearCacheFile(String fileName)
{
File key = new File(getExternalCacheDir(), fileName);
try {
FileWriter writeKey = new FileWriter(key);
BufferedWriter out = new BufferedWriter(writeKey);
out.write("");
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
在我看来,出现这个错误是因为activity在onPostExecute(String result)方法运行时被销毁了。为避免这种情况,您应该在 activity 被销毁时取消所有 运行 AsyncTask。
这是有问题的 doInBackground 代码:-
@Override
protected String doInBackground(Void... params) {
try {
jsonArray = LoadCacheAction();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject obj = jsonArray.getJSONObject(i);
HttpResponse httpResponse = httpResponse = ((Globals) getApplication()).SendDataApache("employeeactions", obj);;
if (httpResponse != null) {
int code = httpResponse.getStatusLine().getStatusCode();
if ((code == 200) || (code == 201)){
return "ok";
}
else if ((code == 400)){
((Globals) getApplication()).WriteEventLogCache(((Globals) getApplication()).TodaysDate(), "3", "1", ((Globals) getApplication()).getIdUser(), "400 - Bad request error - Clocking Action");
return code + "";
}
else
return code + "";
}
}
((Globals) getApplication()).WriteEventLogCache(((Globals) getApplication()).TodaysDate(), "3", "1", ((Globals) getApplication()).getIdUser(), "Just Testing");
return "error";
} catch (Exception e) {
((Globals) getApplication()).WriteEventLogCache(((Globals) getApplication()).TodaysDate(), "3", "1", ((Globals) getApplication()).getIdUser(), e.getMessage());
return "conIssue";
}
}
整个软件包在遇到 return 中的任何一个之前都能完美运行。当它这样做时,软件会完全崩溃。我试过删除方法中的所有内容,只是 return "ok" 但它仍然崩溃。
有没有人有任何建议,为什么因为我真的根本看不到它。
谢谢
史蒂夫
PostExecute 代码:-
protected void onPostExecute(String result) {
if (pDialog.isShowing())
pDialog.dismiss();
if (result == "ok") {
((Globals) getApplication()).ClearCacheFile(((Globals) getApplication()).getActionCacheFileName());
} else {
if (result == "error") {
Toast.makeText(getApplicationContext(),
"Clocking Error. Try Again !!!", Toast.LENGTH_LONG)
.show();
} else {
if (result == "conIssue") {
Toast.makeText(
getApplicationContext(),
"Server not connected. Data will be updated when connection will be available.",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(
getApplicationContext(),
"Clocking Error. Server connection problem !!!",
Toast.LENGTH_LONG).show();
}
}
}
}
这是崩溃发生时日志中显示的内容:-
08-28 09:19:28.271 22411-22411/com.pe_systems.unity.unityandroid E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.pe_systems.unity.unityandroid, PID: 22411
java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{246c3ec6 V.E..... R......D 0,0-959,128} not attached to window manager
at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:396)
at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:322)
at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:116)
at android.app.Dialog.dismissDialog(Dialog.java:341)
at android.app.Dialog.dismiss(Dialog.java:324)
at com.pe_systems.unity.unityandroid.Clocking.ClockingActivity$ServerConnectionTask.onPostExecute(ClockingActivity.java:408)
at com.pe_systems.unity.unityandroid.Clocking.ClockingActivity$ServerConnectionTask.onPostExecute(ClockingActivity.java:357)
at android.os.AsyncTask.finish(AsyncTask.java:636)
at android.os.AsyncTask.access0(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
08-28 09:19:28.272 546-3362/? W/ActivityManager﹕强制整理activity 1 com.pe_systems.unity.unityandroid/.Main.MainActivity 08-2809:19:28.348 546-603/? I/OpenGLRenderer﹕初始化EGL,版本1.4
ClearCaheFile 代码:-
public void ClearCacheFile(String fileName)
{
File key = new File(getExternalCacheDir(), fileName);
try {
FileWriter writeKey = new FileWriter(key);
BufferedWriter out = new BufferedWriter(writeKey);
out.write("");
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
在我看来,出现这个错误是因为activity在onPostExecute(String result)方法运行时被销毁了。为避免这种情况,您应该在 activity 被销毁时取消所有 运行 AsyncTask。