ProgressDialog или ProgressBar замедляет работу приложения под управлением Android 4.1

Я разрабатываю приложение для Android, в котором я использую AsyncTask для получения информации из веб-службы с использованием JSON, которая затем загружается в ListView. Пока здесь все работает нормально.

Я использовал ProgressDialog, который инициирован методом onPreExecute () и отклонен в методе onPostExecute (). В эмуляторе версии 2.3.3 для Android все это действие занимает 7/8 секунд. Я тестировал реальное устройство под управлением 2.3.6, и приложение имеет такое же поведение.

Однако, когда я использую эмулятор с версией 4.1 android, это действие занимает от 65 до 70 секунд. Когда я удаляю ProgressDialog, действие занимает 7/8 секунд в версиях android 2.3 и 4.1. Я тестировал все эти сценарии много раз.

Почему это происходит? У меня нет реального устройства с версией 4.1 для Android, чтобы проверить его, поэтому мне интересно, не проблема ли это в эмуляторе? Я попытался использовать обычный круг диапазона выполнения, а не ProgressDialog, но то же самое происходит, это слишком длится в версии Android версии 4.1.

Любые идеи, по которым может быть причиной этого странного поведения? : S

Спасибо.

Dmon и James McCracken вот код из моей деятельности, можете ли вы помочь мне в этом, пожалуйста?

public class MainActivity extends Activity { private TextView tvTitleList; private ListView lvDataSearch; private ProgressDialog dialog; private long timeStart; private String[] dataSearch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvTitleList = (TextView) findViewById(R.id.tvTitleList); lvDataSearch = (ListView) findViewById(R.id.lvDataSearch); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public class ProcessUpdateList extends AsyncTask<Integer, String, String[]> { @Override protected void onPreExecute() { timeStart = System.currentTimeMillis(); System.out.println("pre execute"); try { tvTitleList.setText("working...."); dialog = ProgressDialog.show(MainActivity.this, "", "Loading. Please wait...", true); } catch (Exception e) { System.out.println("Error Async 1: " + e.getMessage()); } } @Override protected String[] doInBackground(Integer... paramss) { try { System.out.println("Get Data"); dataSearch = getDataSearch(); } catch (Exception e) { System.out.println("Error Async 2: " + e.getMessage()); } System.out.println("Return Data " + ((System.currentTimeMillis() - timeStart) / 1000)); return dataSearch; } @Override protected void onPostExecute(String[] values) { try { System.out.println("Post Execute Data"); tvTitleList.setText("done in " + ((System.currentTimeMillis() - timeStart) / 1000)); updateViewList(); dialog.dismiss(); } catch (Exception e) { System.out.println("Error Async 3: " + e.getMessage()); } } } public void eventUpdateList() { ProcessUpdateList process = new ProcessUpdateList(); try { process.execute(); } catch (Exception e) { System.out.println("NEW ERROR 2: " + e.getMessage()); } } public String[] getDataSearch() { try { String readTwitterFeed = readJSON2("http://search.twitter.com/search.json?q=hey"); JSONObject jsonObject = new JSONObject(readTwitterFeed); JSONArray jsonArray = new JSONArray(); jsonArray.put(jsonObject); Gson gson = new GsonBuilder().setPrettyPrinting().create(); String json = gson.toJson(jsonObject); JSONObject jsonObject2 = new JSONObject(json); JSONObject level1 = jsonObject2.getJSONObject("nameValuePairs"); JSONObject level2 = level1.getJSONObject("results"); JSONArray level3 = level2.getJSONArray("values"); dataSearch = new String[level3.length()]; System.out.println(level3.length()+" resultados encontrados.");; for(int i=0; i<level3.length(); i++) { dataSearch[i] = level3.getJSONObject(i).getJSONObject("nameValuePairs").getString("text"); } } catch(JSONException e) { System.out.println(e.getMessage()); } return dataSearch; } public String readJSON2(String command) { JSONObject jObj = null; StringBuilder builder = new StringBuilder(); HttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(command); try { HttpResponse response = client.execute(httpGet); StatusLine statusLine = response.getStatusLine(); int statusCode = statusLine.getStatusCode(); if (statusCode == 200) { HttpEntity entity = response.getEntity(); InputStream content = entity.getContent(); BufferedReader reader = new BufferedReader( new InputStreamReader(content)); String line; while ((line = reader.readLine()) != null) { builder.append(line); } reader.close(); jObj = new JSONObject(builder.toString()); } else { System.out.println(MainActivity.class.toString() + " Failed to download file"); } } catch (Exception e) { return null; } return builder.toString(); } public void updateViewList() { ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, dataSearch); lvDataSearch.setAdapter(adapter); } public void clickBRefreshList(View v) { eventUpdateList(); } } 

Solutions Collecting From Web of "ProgressDialog или ProgressBar замедляет работу приложения под управлением Android 4.1"

Я могу подтвердить это же поведение только в эмуляторе, тестирование на 4.1. На моем самом устройстве (Galaxy S3 – 4.1) этого не происходит. Кроме того, это происходит только с неопределенными индикаторами выполнения. Я не знаю, почему это происходит, но, может быть, вам станет легче узнать, как это происходит с другими. Я выполняю почти те же действия, что и вы, подключаясь к веб-сервису, анализируя xml-ответ, а затем отображая анализируемый ответ. FYI, я использую ProgressBar для android:empty функция ListView .

EDIT: Рань некоторые тесты

Я тестировал разбор XML-файла и с помощью ProgressBar в макете, я получил это:

Parse time: 94785 ms

Итак, я изменил это

 <ProgressBar android:id="@id/android:empty" style="@android:style/Widget.Holo.ProgressBar" android:layout_width="wrap_content" android:layout_height="0dip" android:layout_gravity="center_horizontal|center_vertical" android:layout_weight="1"/> 

к этому

  <TextView android:id="@id/android:empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Searching..."/> 

И получил это Parse time: 2642 ms

Примечание: мои ProgressBar и ListView находятся в LinearLayout и все синтаксические AsyncTask выполняются в AsyncTask . Это все на эмуляторе. Действительно странно … Мое предположение заключается в том, что эмулятор фактически не отделяет потоки от пользовательского интерфейса , поэтому AsyncTask и ProgressBar борется за циклы процессора, тогда как в реальном телефоне он работает по назначению, потому что он не эмулируется.

Edit: Итак, после просмотра TaskManager на моем WinXP, эмулятор запускается с 7 потоками. Я запускаю свое приложение, запускаю несколько AsyncTask с помощью AsyncTask.THREAD_POOL_EXECUTOR и количество потоков никогда не изменяется с 7 (в диспетчере задач) в течение всего этого процесса.