android - 异步任务并从 url NullPointerException 解析 JSONObject

标签 android json android-asynctask nullpointerexception html-parsing

这是我的问题。

我尝试从 url 获取 JSONObject。这是我的解析器:

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
            HttpParams params = new BasicHttpParams();
            params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
            HttpClient httpClient = new DefaultHttpClient(params);
            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;
    }
}

这是我的主要 Activity :

public class MainActivity extends ActionBarActivity {

    private TextView tv;
    private static final String urllisteemplois = "the url that contains the json";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.text);
        JParse jParse = new JParse(urllisteemplois);
        jParse.execute();
        String result = jParse.concat();
        tv.setText(result);
    }
}

这是我的 ASynctask :

public class JParse extends AsyncTask<String, String, JSONObject> {
    private String url;
    private JSONObject json;

    public JParse(String url) {
        this.url=url;
    }


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected JSONObject doInBackground(String... args) {
        JSONParser jParser = new JSONParser();
        JSONObject json2 = jParser.getJSONFromUrl(url);
        return json2;
    }

    @Override
    protected void onPostExecute(JSONObject json2) {
        this.json=json2;
    }

    public String concat()
    {
        String result = this.json.toString()+"hello";
        return result;
    }
}

我收到这个错误:

01-20 03:18:43.797    2298-2298/com.aziz.bdk.ryadencule E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.aziz.bdk.ryadencule, PID: 2298
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.aziz.bdk.ryadencule/com.aziz.bdk.ryadencule.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.toString()' on a null object reference

我尝试了一些东西,我知道在 onPostExecute 中,this.json 不是 null 并且包含我解析的 JSON ,在 concat() 方法中它是 null

此外,我需要在 doInBackground(..) 中添加 onPostExecute(json2),它不会自动执行。

感谢您的帮助!

最佳答案

onCreate 中的这段代码是问题所在:

jParse.execute();
String result = jParse.concat();
tv.setText(result);

因为 AsyncTask 是异步的,当您调用 jParse.concat() 并且 json 对象仍然为空时,对 jParse.execute() 的调用仍在运行。

您应该只在 onCreate 中执行第一行,然后将后两行移至您的 JParse 对象中的 onPostExecute

关于android - 异步任务并从 url NullPointerException 解析 JSONObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28037363/

相关文章:

php - 将对象作为 json 返回时访问 Eloquent 关系

javascript - 如何删除 html 中追加的重复项?

java - 将外部图像加载到 GridView (无图像)

android - Facebook 和 Android SDK

android - React Native + WebView + android 模拟器,WebGL 支持

PHP JSON 按相同值分组

android - 使用 asyncTask 更新 ListView

java - 致命异常 : AsyncTask #2 An error occured while executing doInBackground() IndexOutOfBoundsException: Invalid index 1, 大小为 1

android - 21000 毫秒的套接字超时从何而来?

android - 在适用于 Android 的 OpenGL ES 应用程序的开头显示加载图标