2013-08-10 2 views
0

Я создал класс разбора JSON, который возвращает строку. когда я устанавливаю текст текстового вида на строку, он печатает '[email protected]'Функция json parsing возвращает странное имя пакета

Что происходит не так?

Heres синтаксический класс

import android.os.AsyncTask; 
import android.util.Log; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.params.BasicHttpParams; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

/** 
* Created by Vaibhav on 8/9/13. 
*/ 
public class JSONParser extends AsyncTask<String, Void, String>{ 
    protected String doInBackground(String... url) { 
     DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams()); 
     HttpGet httpget = new HttpGet(url[0]); 
     //httppost.setHeader("Content-type", "application/json"); 

     InputStream inputStream = null; 
     String result; 
     try { 
     HttpResponse response = httpclient.execute(httpget); 
     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; 
     while ((line = reader.readLine()) != null) 
     { 
      sb.append(line + "\n"); 
     } 
     result = sb.toString(); 
     return result; 
     } catch (Exception e) { 
     Log.d("com.test.app.JSONParser", "JSON ERROR:" + e.toString()); 
     return null; 
    } 
    finally { 
     try{if(inputStream != null)inputStream.close();}catch(Exception squish){} 
    } 
} 
} 

я вызываю функцию как

String jsonString = new JSONParser().execute(jsonURL).toString(); 

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

EDIT:

Так, так как я хотел выход в виде фрагмента, я только закончил с использованием

How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?

вернуть JSON строку фрагмента вызова, чтобы я мог управлять ею из там.

EDIT 2:

OMG !! это было так легко. Я потратил столько времени на это! Поэтому для всех, у кого есть эта проблема, все, что вам нужно сделать, это добавить .get() в конце вызова.

So: String jsonString = new JSONParser().execute(jsonURL).get(); был мой звонок, и все получилось! Мне даже не нужен блок onPostExecute в моей асинтете.

+0

Что возвращает метод 'execute'? – superEb

+0

, когда я не помещаю .toString(), он дает мне ошибку, говоря, что он получает 'android.os.AsyncTask ' –

+0

См. Мой ответ ниже , почему вы используете AsyncTask, если вы хотите получить результат синхронно? –

ответ

1

Метод doInBackground не возвращает свой результат при вызове execute, а результат передается методу onPostExecute. Похоже, вы используете AsyncTask. Обычно вы делаете что-то с результатом onPostExecute, которому нужен основной поток.

То, что вы видите, это toString выход на JSONParser класса, так как AsyncTask вернется this при вызове execute.

+0

Итак, я добавил onPostExecute, но как заставить его вернуть строку вызывающему с ее пустоты? Спасибо –

+0

Вы не можете, цель AsyncTask - разорвать соединение между вызывающим и процессом выполнения. Если вы хотите сделать это синхронно, просто удалите код из 'AsyncTask' и вызовите его из обычного вызова функции. –

+0

Я получал 'android.os.NetworkOnMainThreadException' раньше, когда это была функция, которую я пытался изменить в asynctask, чтобы попытаться ее исправить –

0

Вы печатаете объект, метод которого toString, скорее всего, не переопределяет печать довольно вывода.

Если JSONParser - это ваш собственный класс, то переопределите метод toString, чтобы напечатать выходные данные желаемым образом. Если JSONParse не является вашим классом, вам нужно найти, как правильно печатать вывод из api doc.

+0

его класс, большой кусок кода, который у меня есть в OP.Но я думаю, проблема в том, что он не возвращает ответ правильно и фактически возвращает функцию. Знаете, как это исправить? –

+0

@VaibhavAggarwal Каков тип возвращаемого метода выполнения? Можете ли вы поделиться своим кодом метода выполнения? –

+0

'execute' не является его кодом, это часть' AsyncTask', и он просто вызывает 'doInBackground' в другом потоке. –

Смежные вопросы