Возвращать данные HTTP-JSON из asyncTask в Activity через прослушиватель

Я пытаюсь вернуть данные JSON из моего расширенного класса AsyncTask в свою активность. Мой код активности выглядит следующим образом:

public class MainActivity extends Activity implements JSONListener{

 private JSONObject jsonData = null;

 @Override
 public void JSONFeedBack(JSONObject jsonData) {
 // TODO Auto-generated method stub
 this.jsonData = jsonData;
 Log.e("JSON check in JSONFeedBack(): ", jsonData.toString() );
 }

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

 new JsonObj(this).execute("http://xml/url");

 }
 }

Мой JSONListener выглядит следующим образом:

import org.json.JSONObject;

public interface JSONListener {
 void JSONFeedBack(JSONObject jsonObj);
}

И мой класс asyncTask выглядит следующим образом:

public class JsonObj extends AsyncTask<string, void,="" jsonobject="">{
 MainActivity activity;
 JSONListener jsonListener;
 int tid;
 String term;

 public JsonObj(JSONListener jsonListener){
 this.jsonListener = jsonListener;
 }

 @Override
 protected JSONObject doInBackground(String... url) {

 // TODO Auto-generated method stub
 DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
 HttpPost httppost = new HttpPost(url[0]);
 JSONObject jsonObject = null;
 // Depends on your web service
 httppost.setHeader("Content-type", "application/json");

 InputStream inputStream = null;
 String result = null;
 try {
 HttpResponse response = httpclient.execute(httppost); 
 HttpEntity entity = response.getEntity();

 inputStream = entity.getContent();
 // json is UTF-8 by default
 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
 StringBuilder sb = new StringBuilder();

 String line = null;
 while ((line = reader.readLine()) != null){
 sb.append(line + "\n");
 }
 result = sb.toString();
 Log.e("JSON-Test [RESULT]: ", result);
 jsonObject = new JSONObject(result);


 } catch (Exception e) { 
 Log.e("JSON-Test [exception]: ", e.toString());
 }
 finally {
 try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
 }

 return jsonObject;
 }

 @Override
 protected void onPostExecute(JSONObject result) {
 // TODO Auto-generated method stub
 super.onPostExecute(result);
 this.jsonListener.JSONFeedBack(result);
 Log.e("OnPostExecute TEST: ", result.toString());

 }
}
</string,>

Фактическая выборка данных JSON по HTTP-REQUEST выглядит следующим образом:

[
{
"data": {
"term": "All Nations Praise",
"tid": "10"
}
},
{
"data": {
"term": "Classified Advertisements",
"tid": "16"
}
},
{
"data": {
"term": "Kid's",
"tid": "11"
}
},
{
"data": {
"term": "KT Creative",
"tid": "9"
}
},
{
"data": {
"term": "KT Diary",
"tid": "8"
}
},
{
"data": {
"term": "Live at the Coronet",
"tid": "14"
}
},
{
"data": {
"term": "Situations Vacant",
"tid": "15"
}
},
{
"data": {
"term": "X:Change",
"tid": "13"
}
},
{
"data": {
"term": "Youth",
"tid": "12"
}
}
]

Итак, я получаю исключение нулевого указателя при моем вызове Log.e("JSON check in JSONFeedBack(): ", jsonData.toString()); в моем JSONFeedBack в классе Activity.

Я подтвердил, что данные JSON извлекаются в AsynchClass, но мои попытки отправить его в действие продолжают приводить к исключению нулевого указателя.

2 ответа

Я только что запустил ваш код, меняя URL-адрес с одним из моих сервисов и отлично работающий... Я думаю, что возникает проблема при создании JSONObject

jsonObject = new JSONObject(result);

вы уверены, что не заходите в эту строку:

Log.e("JSON-Test [exception]: ", e.toString());

т.е. если я использую этот URL-адрес http://puppygifs.tumblr.com/api/read/json, я получаю исключение, создающее JSONObject а затем NPE, которое вы получаете.

Я уверен, что связь между AsynchTask и Activity работает, проблема в вашем ответе или как вы его разбираете.


Не добавляйте новый строковый символ в строку Json.

String line = null;
 while ((line = reader.readLine()) != null){
 sb.append(line); // remove + "\n" here
 }

Изменение: вы должны увидеть исключение из-за этого на вашем Log.e("JSON-Test [exception]: ", e.toString());

licensed under cc by-sa 3.0 with attribution.