【问题标题】:Not able to fetch json data from server in android app无法从 android 应用程序中的服务器获取 json 数据
【发布时间】:2014-12-12 08:43:49
【问题描述】:

我正在 android 中进行一个从给定 url 获取 JSON 文件的活动。 JSON 文件将提供视频的 URL 和将显示在活动中的图像缩略图。

但我无法从我传递给 GetData 类的硬编码 url 中获取 JSON。类型是 GET。事实上,我什至无法运行它,该活动使应用程序崩溃。请告诉我代码中的问题。

附:我已经包含了互联网权限。

    public class GetData extends AsyncTask<String, Void, Boolean>{

    protected Boolean doInBackground(String... url) {

        try {

        HttpGet httpRequest = null;
        httpRequest = new HttpGet(url.toURI());

        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);

        HttpEntity entity = response.getEntity();
        BufferedHttpEntity b_entity = new BufferedHttpEntity(entity);
        String input = b_entity.getContent().toString();


        JSONObject jobj1 = new JSONObject(input).getJSONObject("thumb");
        JSONObject jobj2 = new JSONObject(input).getJSONObject("video");
        url_thmb=jobj1.getString("thumb");
        url_vdo=jobj2.getString("video");

    }catch(JSONException e){
            Log.e("EX", e.toString());
    }catch (URISyntaxException e){
            e.printStackTrace();
    }catch (MalformedURLException e){
            Log.e("log", "bad url");
    }catch (IOException e) {
            Log.e("log", "io error");
    }
        return null;
    }

logcat 说:

12-12 14:23:15.050: D/dalvikvm(23233): Late-enabling CheckJNI
12-12 14:23:15.170: I/dalvikvm(23233): Could not find method android.view.ViewGroup.onNestedScrollAccepted, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.onNestedScrollAccepted
12-12 14:23:15.170: W/dalvikvm(23233): VFY: unable to resolve virtual method 11338: Landroid/view/ViewGroup;.onNestedScrollAccepted (Landroid/view/View;Landroid/view/View;I)V
12-12 14:23:15.170: D/dalvikvm(23233): VFY: replacing opcode 0x6f at 0x0000
12-12 14:23:15.170: I/dalvikvm(23233): Could not find method android.view.ViewGroup.onStopNestedScroll, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.onStopNestedScroll
12-12 14:23:15.170: W/dalvikvm(23233): VFY: unable to resolve virtual method 11344: Landroid/view/ViewGroup;.onStopNestedScroll (Landroid/view/View;)V
12-12 14:23:15.170: D/dalvikvm(23233): VFY: replacing opcode 0x6f at 0x0000
12-12 14:23:15.170: I/dalvikvm(23233): Could not find method android.support.v7.internal.widget.ActionBarOverlayLayout.stopNestedScroll, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.setHideOnContentScrollEnabled
12-12 14:23:15.170: W/dalvikvm(23233): VFY: unable to resolve virtual method 9032: Landroid/support/v7/internal/widget/ActionBarOverlayLayout;.stopNestedScroll ()V
12-12 14:23:15.170: D/dalvikvm(23233): VFY: replacing opcode 0x6e at 0x000e
12-12 14:23:15.190: I/dalvikvm(23233): Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations
12-12 14:23:15.190: W/dalvikvm(23233): VFY: unable to resolve virtual method 364: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
12-12 14:23:15.190: D/dalvikvm(23233): VFY: replacing opcode 0x6e at 0x0002
12-12 14:23:15.190: I/dalvikvm(23233): Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType
12-12 14:23:15.190: W/dalvikvm(23233): VFY: unable to resolve virtual method 386: Landroid/content/res/TypedArray;.getType (I)I
12-12 14:23:15.190: D/dalvikvm(23233): VFY: replacing opcode 0x6e at 0x0002
12-12 14:23:15.271: D/AndroidRuntime(23233): Shutting down VM
12-12 14:23:15.271: W/dalvikvm(23233): threadid=1: thread exiting with uncaught exception (group=0x41635d88)
12-12 14:23:15.271: E/AndroidRuntime(23233): FATAL EXCEPTION: main
12-12 14:23:15.271: E/AndroidRuntime(23233): Process: com.example.streamer, PID: 23233
12-12 14:23:15.271: E/AndroidRuntime(23233): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.streamer/com.example.streamer.MainActivityStream}: java.lang.NullPointerException
12-12 14:23:15.271: E/AndroidRuntime(23233):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2237)
12-12 14:23:15.271: E/AndroidRuntime(23233):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2286)
12-12 14:23:15.271: E/AndroidRuntime(23233):    at android.app.ActivityThread.access$800(ActivityThread.java:144)
12-12 14:23:15.271: E/AndroidRuntime(23233):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1246)
12-12 14:23:15.271: E/AndroidRuntime(23233):    at android.os.Handler.dispatchMessage(Handler.java:102)
12-12 14:23:15.271: E/AndroidRuntime(23233):    at android.os.Looper.loop(Looper.java:212)
12-12 14:23:15.271: E/AndroidRuntime(23233):    at android.app.ActivityThread.main(ActivityThread.java:5135)
12-12 14:23:15.271: E/AndroidRuntime(23233):    at java.lang.reflect.Method.invokeNative(Native Method)
12-12 14:23:15.271: E/AndroidRuntime(23233):    at java.lang.reflect.Method.invoke(Method.java:515)
12-12 14:23:15.271: E/AndroidRuntime(23233):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
12-12 14:23:15.271: E/AndroidRuntime(23233):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
12-12 14:23:15.271: E/AndroidRuntime(23233):    at dalvik.system.NativeStart.main(Native Method)
12-12 14:23:15.271: E/AndroidRuntime(23233): Caused by: java.lang.NullPointerException
12-12 14:23:15.271: E/AndroidRuntime(23233):    at com.example.streamer.MainActivityStream.onCreate(MainActivityStream.java:64)
12-12 14:23:15.271: E/AndroidRuntime(23233):    at android.app.Activity.performCreate(Activity.java:5231)
12-12 14:23:15.271: E/AndroidRuntime(23233):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
12-12 14:23:15.271: E/AndroidRuntime(23233):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2201)
12-12 14:23:15.271: E/AndroidRuntime(23233):    ... 11 more
12-12 14:23:21.817: E/EX(23233): org.json.JSONException: Value java.io.ByteArrayInputStream@42eeb310 of type java.lang.String cannot be converted to JSONObject

【问题讨论】:

  • 你能分享你的 LogCat 和你试图获取的 url
  • 能否也分享一下logcat错误详情
  • 发布错误logcat
  • 在 onPostExecuteMehtod() 中解析 json。
  • 我做了这些更正仍然无法正常工作。

标签: android json getjson http-get background-task


【解决方案1】:

这个错误意味着你没有得到任何 JSON,我建议你记录你的数据。

String input = b_entity.getContent().toString();
Log.d("log_tag", "input = " + input.toString());
JSONObject jobj1 = new JSONObject(input);
Log.d("log_tag", "json = " + jobj1.toString());

【讨论】:

  • 让我试试看。
  • 它没有显示该标签在 logcat 中的任何条目。似乎在该行之前有 sum 错误
  • @Ajinkya 这意味着你没有得到任何 json。你控制服务器端吗
  • 不...我无权访问服务器
  • 代码中的任何其他建议/更改我可以做些什么来使它工作?
【解决方案2】:

试试这个。

// Create new Socket
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
// Start streaming
InputStream is = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8);
// Initialize Line
String line = null;
// Start reading
while ((line = reader.readLine()) != null)
{
    JSONObject reader = new JSONObject(line);
    url_thmb = reader.getString("thumb");
    url_vdo = reader.getString("video");
}

编辑:

这是不可能的,因为我刚刚运行了该代码并且输出如下。检查您的 Json 文件或代码。

输出是:

12-12 18:27:41.433: I/Choreographer(12476): Skipped 58 frames!  The application may be doing too much work on its main thread.
12-12 18:27:48.300: I/System.out(12476): URL_TMB = 01 URL_VDO = 001
12-12 18:27:52.355: I/System.out(12476): URL_TMB = 02 URL_VDO = 002
12-12 18:27:53.472: I/System.out(12476): URL_TMB = 03 URL_VDO = 003
12-12 18:27:54.394: I/System.out(12476): URL_TMB = 04 URL_VDO = 004
12-12 18:27:55.394: I/System.out(12476): URL_TMB = 05 URL_VDO = 005
12-12 18:27:56.324: I/System.out(12476): URL_TMB = 06 URL_VDO = 006
12-12 18:27:59.371: I/System.out(12476): URL_TMB = 07 URL_VDO = 007
12-12 18:28:00.316: I/System.out(12476): URL_TMB = 08 URL_VDO = 008
12-12 18:28:01.269: I/System.out(12476): URL_TMB = 09 URL_VDO = 009
12-12 18:28:11.105: W/jdwp(12476): Debugger is telling the VM to exit with code=1
12-12 18:28:11.105: I/dalvikvm(12476): GC lifetime allocation: 7948 bytes

编辑 2: 这是另一个测试输出。 (我必须将 xyz 更改为 example,因为 SOF 测试编辑器不允许我使用它。)

12-13 02:14:45.711: I/System.out(18424): url_thmb = http://example.com/intern/ajnk/thumb.jpg url_vdo = http://example.com/intern/ajnk/vid.mp4
12-13 02:14:46.610: D/lights(273): set_light_backlight: brightness=20
12-13 02:14:49.640: I/ActivityManager(273): Start proc com.sonyericsson.appshare for service com.sonyericsson.appshare/.backend.synchronization.SyncService: pid=18529 uid=10024 gids={3003, 1015}
12-13 02:14:49.750: D/dalvikvm(17648): GC_EXPLICIT freed 319K, 50% free 3396K/6791K, external 1685K/2133K, paused 111ms

【讨论】:

  • 再次检查我的答案。我添加了示例输出
  • 我可能没有正确接收到 json 文件。
  • 这是我想到的第一件事
  • 代码中的任何其他建议/更改我可以做些什么来使它工作?
  • 如何发布您的 Json 文件的某些部分。你或我可能遗漏了一些观点。
【解决方案3】:

刚刚通过在 mainActivity 中解析 JSON 而不是在后台执行它来修改上面的代码(有问题的代码),它对我有用。

在mainActivity中添加:

    GetData getData=new GetData();
    getData.execute();
    String result = null;

    try{
        result = getData.get().toString();
    }catch(Exception e){}

    try{
        JSONObject jobj1 = new JSONObject(result);
        str=jobj1.getString("thumb").toString();
        str1=jobj1.getString("video").toString();
    }catch(JSONException e){
            Log.d("EX", e.toString());
    }`

并从我之前在后台执行的 getData 中删除 JSON 解析。

【讨论】:

    猜你喜欢
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    相关资源
    最近更新 更多