这是一个获取 json 字符串并解析它的函数。我使用了 try catch 并检查了如果响应是空或 null 方法应该返回null。另外我有一个条件,当我使用这个方法,如果方法返回null我将通知用户并关闭此活动,并做其他事情。
但是当我运行应用程序并且json无效(为空,空或不是json格式)时,应用程序挂起,只有我看到SplashScreen。
public List<UpdateItemsModel> GetAllAddItems(String response)
{
try
{
if(response == null || response == "")
{
return null;
}
List<UpdateItemsModel> result = new ArrayList<UpdateItemsModel>();
JSONObject json = new JSONObject(response);
JSONArray add = null;;
JSONObject temp = null;
JSONObject values = null;
UpdateItemsModel item = null;
Course course = null;
if(json.has("add"))
{
add = json.getJSONArray("add");
}
if(add != null){
for(int i=0;i<add.length();i++)
{
//add function here
temp = add.getJSONObject(i);
if(temp.getString("tableName").equals("tbl_course"))
{
values = temp.getJSONObject("values");
course = new Course();
course.setChapterId(values.getInt("chapter_id"));
course.setFavorite(values.getBoolean("favorite"));
course.setId(values.getInt("id"));
course.setRead(values.getBoolean("read"));
course.setText(values.getString("text"));
course.setTitle(values.getString("title"));
item = new UpdateItemsModel();
item.setCourse(course);
result.add(item);
}
}
}
return result;
}
catch(Exception e)
{
HandleExceptions.ReportErrorToServer(e);
return null;
}
}
记录结果:
08-22 08:45:58.941: I/ActivityManager(472): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.book/.SplashActivity} from pid 5030
08-22 08:45:58.953: W/audio_hw_primary(114): out_write() limiting sleep time 34149 to 23219
08-22 08:45:58.977: W/audio_hw_primary(114): out_write() limiting sleep time 35759 to 23219
08-22 08:45:59.001: W/audio_hw_primary(114): out_write() limiting sleep time 27369 to 23219
08-22 08:45:59.085: D/dalvikvm(472): GC_FOR_ALLOC freed 1966K, 33% free 11025K/16392K, paused 26ms, total 27ms
08-22 08:45:59.193: D/dalvikvm(14508): Late-enabling CheckJNI
08-22 08:45:59.197: I/ActivityManager(472): Start proc com.example.book for activity com.example.book/.SplashActivity: pid=14508 uid=10049 gids={50049, 3003, 1028}
08-22 08:45:59.505: D/libEGL(14508): loaded /system/lib/egl/libEGL_genymotion.so
08-22 08:45:59.505: D/(14508): HostConnection::get() New Host Connection established 0xb8ff7e08, tid 14508
08-22 08:45:59.537: D/libEGL(14508): loaded /system/lib/egl/libGLESv1_CM_genymotion.so
08-22 08:45:59.537: D/libEGL(14508): loaded /system/lib/egl/libGLESv2_genymotion.so
08-22 08:45:59.681: W/EGL_genymotion(14508): eglSurfaceAttrib not implemented
08-22 08:45:59.685: E/OpenGLRenderer(14508): Getting MAX_TEXTURE_SIZE from GradienCache
08-22 08:45:59.693: E/OpenGLRenderer(14508): Getting MAX_TEXTURE_SIZE from Caches::initConstraints()
08-22 08:45:59.697: D/OpenGLRenderer(14508): Enabling debug mode 0
08-22 08:45:59.885: I/ActivityManager(472): Displayed com.example.book/.SplashActivity: +754ms
08-22 08:46:00.429: W/TelephonyManager(14508): Overriding DeviceId with 000000000000000
答案 0 :(得分:0)
我认为您的SplashScreen逻辑存在一些问题。只需在尝试之前添加return null;
,然后查看最新情况。
你也必须用这种方式检查字符串的相等性:
response.equals("");
response == something
检查这些字符串的引用而不是它们的值,如果这些字符串指向同一位置,则结果为true,否则为false。这些字符串可能引用两个不同的位置,但可能具有相同的值,如下所示:
String s1 = "1223";
String s2 = "1223";
s1==s2 // returns false
s1.equals(s2) // returns true