【问题标题】:what the error in this code to get json data? [duplicate]这段代码中获取 json 数据的错误是什么? [复制]
【发布时间】:2013-08-31 07:41:03
【问题描述】:

这段代码有什么错误?

我想添加一个 facebook 页面名称并获取其 json 数据,但有一些我无法发现的错误。这些是我使用的所有文件并添加了 logcat 消息:

PagesActivity.java

package com.engahmedphp.facebookcollector;

import org.json.JSONException;
import org.json.JSONObject;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class PagesActivity extends Activity {

    DatabaseHandler db = new DatabaseHandler(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pages);

        final Button button = (Button) findViewById(R.id.addPage);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                AlertDialog.Builder alert = new AlertDialog.Builder(
                        PagesActivity.this);

                alert.setTitle("Add New Page");
                alert.setMessage("Enter Page Name OR Valid Facebook Link");

                // Set an EditText view to get user input
                final EditText input = new EditText(PagesActivity.this);
                alert.setView(input);

                alert.setPositiveButton("Ok",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {
                                String value = input.getText().toString();
                                // Do something with value!
                                String url = "http://graph.facebook.com/"
                                        + value + "/?fields=picture,name";
                                // Creating JSON Parser instance
                                JSONParser jParser = new JSONParser();

                                // getting JSON string from URL
                                JSONObject json = jParser.getJSONFromUrl(url);

                                try {
                                    // Storing each json item in variable

                                    String name = json.getString("name");
                                    String fid = json.getString("id");
                                    String picture = json
                                            .getJSONObject("picture")
                                            .getJSONObject("data")
                                            .getString("url");

                                    db.addPage(name, fid, picture);

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                                // addPageData(value);
                            }
                        });

                alert.setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {
                                // Canceled.
                            }
                        });

                alert.show();
            }
        });

    }

    void addPageData(String pageName) {
        String url = "http://graph.facebook.com/" + pageName
                + "/?fields=picture,name";
        // Creating JSON Parser instance
        JSONParser jParser = new JSONParser();

        // getting JSON string from URL
        JSONObject json = jParser.getJSONFromUrl(url);

        try {
            // Storing each json item in variable

            String name = json.getString("name");
            String fid = json.getString("id");
            String picture = json.getJSONObject("picture")
                    .getJSONObject("data").getString("url");

            db.addPage(name, fid, picture);

        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.splash, menu);
        return true;
    }

}

JSONParser.java

package com.engahmedphp.facebookcollector;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();           

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }
}

LogCat

08-31 03:35:23.031: D/dalvikvm(15972): GC_FOR_ALLOC freed 39K, 6% free 2633K/2792K, paused 65ms, total 68ms
08-31 03:35:23.041: I/dalvikvm-heap(15972): Grow heap (frag case) to 3.767MB for 1136500-byte allocation
08-31 03:35:23.163: D/dalvikvm(15972): GC_FOR_ALLOC freed 2K, 5% free 3740K/3904K, paused 116ms, total 116ms
08-31 03:35:23.511: D/gralloc_goldfish(15972): Emulator without GPU emulation detected.
08-31 03:35:26.611: I/Choreographer(15972): Skipped 30 frames!  The application may be doing too much work on its main thread.
08-31 03:39:40.903: D/dalvikvm(15972): GC_FOR_ALLOC freed 47K, 4% free 4013K/4180K, paused 48ms, total 81ms
08-31 03:39:40.903: I/dalvikvm-heap(15972): Grow heap (frag case) to 4.638MB for 635812-byte allocation
08-31 03:39:41.023: D/dalvikvm(15972): GC_FOR_ALLOC freed 2K, 4% free 4631K/4804K, paused 111ms, total 111ms
08-31 03:39:41.483: I/Choreographer(15972): Skipped 83 frames!  The application may be doing too much work on its main thread.
08-31 03:39:48.701: D/AndroidRuntime(15972): Shutting down VM
08-31 03:39:48.701: W/dalvikvm(15972): threadid=1: thread exiting with uncaught exception (group=0x414c4700)
08-31 03:39:48.741: E/AndroidRuntime(15972): FATAL EXCEPTION: main
08-31 03:39:48.741: E/AndroidRuntime(15972): android.os.NetworkOnMainThreadException
08-31 03:39:48.741: E/AndroidRuntime(15972):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at java.net.InetAddress.getAllByName(InetAddress.java:214)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at com.engahmedphp.facebookcollector.JSONParser.getJSONFromUrl(JSONParser.java:38)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at  com.engahmedphp.facebookcollector.PagesActivity$1$1.onClick(PagesActivity.java:49)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at android.os.Looper.loop(Looper.java:137)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at android.app.ActivityThread.main(ActivityThread.java:5103)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at java.lang.reflect.Method.invokeNative(Native Method)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at java.lang.reflect.Method.invoke(Method.java:525)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-31 03:39:48.741: E/AndroidRuntime(15972):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: java android json


    【解决方案1】:

    您将收到NetworkOnMainThreadException。见How to fix android.os.NetworkOnMainThreadException?。当应用程序尝试在其主 (UI) 线程上执行网络操作时,将引发此异常。使用AsyncTask 或在新线程中执行网络任务。有关此异常的原因,请参阅NetworkOnMainThreadException 上的 Android 文档。

    这里:

    // getting JSON string from URL
    JSONObject json = jParser.getJSONFromUrl(url);
    

    您正在主 UI 线程上执行与网络相关的工作。尝试在新线程中执行此操作。

    【讨论】:

    • 在onclicklistener中解析json数据有问题吗??我认为这是错误
    • 问题是您不能在主 UI 线程上执行此操作。您目前可以在 UI 线程上执行此操作。您需要启动一个新线程,然后调用“HTTP”相关方法。因此,只需关注您的 LogCat。在新线程中执行上述操作。
    • 对不起,但我不专业..你能给我链接包含堆栈上那个或旧问题的教程
    • 有 2 个链接有问题。但是找到更多techblogistech.com/2011/11/…。也有一个不好的工作不鼓励stackoverflow.com/questions/12650921/…
    【解决方案2】:

    JSONParser 在 UI 线程中进行 HTTP 连接(在 UI 线程中调用 oneClick),现在它被禁止了。 所以你需要将网络代码移动到其他线程。

    【讨论】:

      【解决方案3】:

      如果您没有注意到;对于 Android 3.0 (Honeycomb) 或更高版本,网络访问的 StrictMode 会导致致命错误,除非您的应用针对的是 Honeycomb 之前的 API 版本。

      解决这个问题的正确方法是使用Android AsyncTask进行网络访问。

      处理这种情况的懒惰方法是打开检查:

      StrictMode.ThreadPolicy 策略 = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);

      【讨论】:

        【解决方案4】:

        正如其他人所提到的,您不应该在 UI 线程上进行联网以使您的应用 UI 响应。

        试试这个

        public class JsonParser extends AsyncTask<String, Void, JSONObject> {
        
        InputStream is = null;
        JSONObject jObj = null;
        String json = "";
        
        @Override
        protected JSONObject doInBackground(String... params) {
        
            // Making HTTP request
            try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(params[0]);
        
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        
            } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            } catch (ClientProtocolException e) {
            e.printStackTrace();
            } catch (IOException e) {
            e.printStackTrace();
            }
        
            try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
            } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
            }
        
            // try parse the string to a JSON object
            try {
            jObj = new JSONObject(json);
            } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
            }
        
            // return JSON String
            return jObj;
        }
        
        @Override
        protected void onPostExecute(JSONObject json) {
        
            try {
                    // Storing each json item in variable
        
                    String name = json.getString("name");
                    String fid = json.getString("id");
                    String picture = json
                            .getJSONObject("picture")
                            .getJSONObject("data")
                            .getString("url");
        
                    db.addPage(name, fid, picture);
        
                } catch (JSONException e) {
                    e.printStackTrace();
                }
        }
        
        }
        

        将上面的类放到你的activity类中,然后使用new JsonParser().execute(url);获取数据并更新数据库。

        【讨论】:

          猜你喜欢
          • 2011-10-07
          • 1970-01-01
          • 1970-01-01
          • 2014-01-10
          • 2018-07-07
          • 2012-03-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多