Магия при работе с json

Lucifer777
Сообщения: 122
Зарегистрирован: 18 ноя 2013, 17:53

Re: Магия при работе с json

Сообщение Lucifer777 » 11 фев 2014, 10:58

altwin писал(а):
Lucifer777 писал(а): В лог выводил, там находится тоже самое, что в режиме debug при просмотре значения переменной,в которой сохроняю json. Сохранение json в String происходит таким образом:

HttpGet httpGet = new HttpGet(url);

httpResponse = httpClient.execute(httpGet);

httpEntity = httpResponse.getEntity();
String response = EntityUtils.toString(httpEntity);
Никогда не делайте так. Все запросы должны быть асинхронны.
пример делает запрос к vk и получает json, url фото категории 605 выводятся в лог(вообще не важно, важен запрос и как он делается)
[syntax=java5]
String url = "https://api.vk.com/method/photos.search ... 5000&v=5.7";
AsyncHttpClient client = new AsyncHttpClient();
client.get(url, new AsyncHttpResponseHandler() {

@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
super.onSuccess(statusCode, headers, responseBody);

try {
JSONObject jsonObject = new JSONObject(new String(responseBody));
JSONObject jsonResult = jsonObject.getJSONObject("response");
JSONArray jArray = jsonResult.getJSONArray("items");

for (int i = 0; i < jArray.length(); i++) {
try {
JSONObject oneObject = jArray.getJSONObject(i);

Log.d(LOG_TAG, oneObject.getInt("id")
+ ": "
+ oneObject.getString("photo_604"));
} catch (JSONException e) {
e.printStackTrace();
Log.d(LOG_TAG, "JSONException in for loop");
}
}
} catch (JSONException e) {
e.printStackTrace();
Log.d(LOG_TAG, "JSONException with get json");
}
}
});
[/syntax]
1. Запрос асинхронный
2. Не надо пихать json в строку, для этого есть JSONObject

стал пробовать, появился такой вопрос. Почему в режиме отладки в строчки 10-... не заходит отладчик?

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Магия при работе с json

Сообщение altwin » 11 фев 2014, 11:32

Lucifer777 писал(а):
altwin писал(а):
Lucifer777 писал(а): В лог выводил, там находится тоже самое, что в режиме debug при просмотре значения переменной,в которой сохроняю json. Сохранение json в String происходит таким образом:

HttpGet httpGet = new HttpGet(url);

httpResponse = httpClient.execute(httpGet);

httpEntity = httpResponse.getEntity();
String response = EntityUtils.toString(httpEntity);
Никогда не делайте так. Все запросы должны быть асинхронны.
пример делает запрос к vk и получает json, url фото категории 605 выводятся в лог(вообще не важно, важен запрос и как он делается)
[syntax=java5]
String url = "https://api.vk.com/method/photos.search ... 5000&v=5.7";
AsyncHttpClient client = new AsyncHttpClient();
client.get(url, new AsyncHttpResponseHandler() {

@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
super.onSuccess(statusCode, headers, responseBody);

try {
JSONObject jsonObject = new JSONObject(new String(responseBody));
JSONObject jsonResult = jsonObject.getJSONObject("response");
JSONArray jArray = jsonResult.getJSONArray("items");

for (int i = 0; i < jArray.length(); i++) {
try {
JSONObject oneObject = jArray.getJSONObject(i);

Log.d(LOG_TAG, oneObject.getInt("id")
+ ": "
+ oneObject.getString("photo_604"));
} catch (JSONException e) {
e.printStackTrace();
Log.d(LOG_TAG, "JSONException in for loop");
}
}
} catch (JSONException e) {
e.printStackTrace();
Log.d(LOG_TAG, "JSONException with get json");
}
}
});
[/syntax]
1. Запрос асинхронный
2. Не надо пихать json в строку, для этого есть JSONObject

стал пробовать, появился такой вопрос. Почему в режиме отладки в строчки 10-... не заходит отладчик?
если строка кода отработала, то отладчик там был. Поставьте breakpoint на 11 строке - увидите, что было в 10.
Изображение

Lucifer777
Сообщения: 122
Зарегистрирован: 18 ноя 2013, 17:53

Re: Магия при работе с json

Сообщение Lucifer777 » 11 фев 2014, 12:33

altwin писал(а): если строка кода отработала, то отладчик там был. Поставьте breakpoint на 11 строке - увидите, что было в 10.

Код: Выделить всё

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
client = new AsyncHttpClient();
	    
	    client.get(url, new AsyncHttpResponseHandler() {
	    	
	    	@Override
	        public void onSuccess(int statusCode, org.apache.http.Header[] headers, byte[] responseBody) {
	            super.onSuccess(statusCode, headers, responseBody);

	            try {
	                JSONObject jsonObject = new JSONObject(new String(responseBody));
	                JSONObject jsonResult = jsonObject.getJSONObject("response");
	                JSONArray jArray = jsonResult.getJSONArray("items");

	                for (int i = 0; i < jArray.length(); i++) {
	                    try {
	                        JSONObject oneObject = jArray.getJSONObject(i);

	                        Log.d(LOG_TAG, oneObject.getInt("id")
	                                + ": "
	                                + oneObject.getString("photo_604"));
	                    } catch (JSONException e) {
	                        e.printStackTrace();
	                        Log.d(LOG_TAG, "JSONException in for loop");
	                    }
	                }
	            } catch (JSONException e) {
	                e.printStackTrace();
	                
	            }
	        }
	    
	    	
	    	});
		
	}

8-я строка несколько раз командой " Step over" мелькает, а затем сразу перекидывает на 40-ю.
Eclipse отгребает?

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Магия при работе с json

Сообщение altwin » 11 фев 2014, 12:52

В восьмой строке: client.get(url, new AsyncHttpResponseHandler()
наверно что -то пошло не так и onSuccess не отрабатывает.. success -а то нет..
можно посмотреть, какие там еще методы доступны: http://loopj.com/android-async-http/doc ... ndler.html
и добавить какой -то вывод чтобы понять в каком месте печалька приходит...
Изображение

Ответить