首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异步任务和从url NullPointerException解析JSONObject

异步任务和从url NullPointerException解析JSONObject
EN

Stack Overflow用户
提问于 2015-01-20 11:36:54
回答 1查看 1.2K关注 0票数 2

这就是我的问题。

我曾尝试从url获取JSONObject。下面是我的解析器:

代码语言:javascript
运行
复制
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;
    }
}

以下是我的主要活动:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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;
    }
}

我得到了这个错误:

代码语言:javascript
运行
复制
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),它不会自动添加。

谢谢你的帮助!

EN

Stack Overflow用户

发布于 2015-01-20 12:05:51

onCreate中的以下代码就是问题所在:

代码语言:javascript
运行
复制
jParse.execute();
String result = jParse.concat();
tv.setText(result);

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

您应该只执行onCreate中的第一行操作,然后将后两行移动到JParse对象中的onPostExecute

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28037363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档