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);