Android Asynctask和从url NullPointerException解析JSONObject

Android Asynctask和从url NullPointerException解析JSONObject,android,json,android-asynctask,nullpointerexception,html-parsing,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(St

这是我的问题

我试图从
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;
    }
}
以下是我的主要活动:

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);
    }
}
这是我的任务:

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;
    }
}
我尝试了一些东西,我知道在
onPostExecute
中,
this.json
不是
null
并且包含我解析的
json
,在
concat()
方法中它是
null

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


谢谢你的帮助

onCreate中的此代码是问题:

jParse.execute();
String result = jParse.concat();
tv.setText(result);
由于
AsyncTask
是异步的,因此在调用jParse.concat()时,对jParse.execute()的调用仍然在运行,json对象仍然为null


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

谢谢您的回答。实际上,我创建了一个只使用一个方法的接口,我在onPostExecute的最后调用了这个方法,我在MainActivity中重写了这个方法以使用concat方法。
onPostExecute
基本上是对UI线程的“回调”,正如您所知。换句话说,它有点像你为一个接口创建了一个接口。它的设计允许对UI线程进行调用,这样您就不必像以前那样创建线程安全回调。但是,如果您使用的是标准线程,那么您所做的是有用的。。。
jParse.execute();
String result = jParse.concat();
tv.setText(result);