2015-07-14 1 views
0

Вторая активность в моем проекте начинается очень медленно, и я не знаю, как это исправить. Как это работает (все это находится в OnCreate()): во-первых, это получить-запрос на страницу с JSON:android - slow start new Активность

try { 
     DefaultHttpClient hc = new DefaultHttpClient(); 
     ResponseHandler<String> res = new BasicResponseHandler(); 
     HttpGet getMethod = new HttpGet(url); 
     String response = hc.execute(getMethod, res); 
     resStr = response.toString(); 
    } catch (Exception e) { 
     System.out.println("Exp=" + e); 
    } 

Я знаю, некоторые методы из здесь осуждаются, но я не знаю, как сделать его более оптимизировано. В результате он возвращает строку с массивом JSON около 32 объектов. Затем я заполняю 6 массивов, чтобы передать их в ArrayAdapter для заполнения ListView. Методы получения различных типов данных выглядит следующим образом:

public static String GetWantedType(String resStr, int num) { 
    String jsonvalues = ""; 
    try { 
     JSONArray json_Array = new JSONArray(resStr); 
     JSONObject json_data = json_Array.getJSONObject(num); 
     jsonvalues = json_data.getString("wanted_type"); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    return jsonvalues; 
} 

Может быть, я должен был создать json_Array один раз вне заполнения массивов и просто передать его тем методам, как JSONArray, а не в виде строки - я не знаю, если это влияет на скорость. В ArrayAdapter все, кажется, все в порядке, я использую ViewHolder, и моя прокрутка превосходна. В отличие от начального действия.

Как сделать его лучше и более оптимизированным?

+0

Выполняйте всю работу, связанную с сетью, в фоновом режиме. –

+0

Вы добавили код в первый раз? – Pavya

ответ

1

Во-первых, не делать все операции в onCreate(), предпочитают делать в onResume()

Во-вторых, все это требует сервер должен быть в фоновом потоке с использованием Async и использования результатов для отображения пользователю.

Если вы не хотите звонить несколько раз API для данных во время onResume() и onPause(), вы можете потреблять результат данных в массиве или что-то и когда onResume() вызова, вы можете проверить, есть ли данные, просто загрузить его, иначе выбор из сервера.

0

Вы делаете сетевой вызов в основной теме? Пожалуйста, не делай этого. Вместо этого выполняйте сетевые операции в разных потоках.

Для организации сети вы можете использовать библиотеку retrofit. Он также упрощает выполнение операций асинхронно, используя обратные вызовы или используя Observables из RxJava

+0

Не могли бы вы помочь мне с модификацией? Я прочитал некоторые статьи об этом, но не мог понять, как это сделать. –

+0

Вы можете проверить образцы здесь https://github.com/square/retrofit/tree/master/samples или могут быть примерами некоторых блогов, таких как http: //inaka.net/blog/2014/10/10/android-retrofit-rest-client/ также может помочь вам. Или вы можете поделиться своим кодом с github/[любым другим репозиторием git], и я могу внести свой вклад в это. –

1

Как Гаурав сказал, что проблема заключается в том, что сетевой запрос вызывается в основном потоке. В то время, когда вы спрашиваете сетевой звонок, ваша программа говорит: «ОК СТОП Я ЖДЕТ ОТВЕТ. Итак, если вы хотите изменить это, вы можете делать разные вещи. Например, вы можете использовать асинхронную сетевую связь с lib (loopj lib) или просто открыть тему: выполнить сетевой вызов.

С этим ваш пользовательский интерфейс не замерзает