Android - 当json字符串无效或为空时应用程序挂起

时间:2014-08-22 12:32:47

标签: java android json

这是一个获取 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

1 个答案:

答案 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