2012-12-19 38 views
5

Tôi đang phát triển một ứng dụng Android trong đó tôi sử dụng AsyncTask để nhận thông tin từ một dịch vụ Web bằng JSON, sau đó được tải trong một ListView. Cho đến đây, mọi thứ đều hoạt động tốt.ProgressDialog hoặc ProgressBar làm chậm ứng dụng chạy Android 4.1

Tôi đã sử dụng ProgressDialog được khởi tạo trong phương thức onPreExecute() và được loại bỏ trong phương thức onPostExecute(). Trong trình giả lập chạy phiên bản android 2.3.3, tất cả hành động này mất đến 7/8 giây. Tôi đã thử nghiệm với một thiết bị thực chạy 2.3.6 và ứng dụng có hành vi tương tự.

Tuy nhiên, khi tôi sử dụng trình giả lập chạy phiên bản Android 4.1, hành động này mất từ ​​65 đến 70 giây. Khi tôi loại bỏ ProgressDialog, hành động mất 7/8 giây trong cả hai phiên bản Android 2.3 và 4.1. Tôi đã thử nghiệm tất cả các kịch bản này nhiều lần.

Tại sao điều này lại xảy ra? Tôi không có bất kỳ thiết bị thực sự với phiên bản Android 4,1 để kiểm tra nó vì vậy tôi tự hỏi nếu đây là một vấn đề giả lập? Tôi đã cố gắng sử dụng một vòng tròn thanh tiến trình bình thường, thay vì ProgressDialog, nhưng điều tương tự cũng xảy ra, nó chỉ mất quá lâu trong phiên bản Android 4.1.

Bất kỳ ý tưởng nào có thể là lý do cho hành vi kỳ lạ này? : S

Cảm ơn bạn.

dmon và James McCracken đây là mã từ hoạt động của tôi, bạn có thể giúp tôi về điều này không?

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(); 
} 
} 
+0

Tôi không thể nghĩ ra một lý do nào điều này sẽ xảy ra. Bạn có thể đăng nhật ký không? –

+1

Cá gì đó ở đây, cho thấy bất kỳ khung cảnh nào cũng không mất thời gian. Nó cũng không rõ ràng nếu bạn có nghĩa là 0.875 giây hoặc "7 hoặc 8" giây. Nếu bạn có nghĩa là 7-8, sau đó một cái gì đó là chắc chắn sai. Bạn nên đăng mã cho AsyncTask của mình. – dmon

Trả lời

4

Tôi chỉ có thể xác nhận hành vi tương tự này trong trình mô phỏng, thử nghiệm trên 4.1. Trên thiết bị thực tế của tôi (Galaxy S3 - 4.1) điều này không xảy ra. Ngoài ra, nó chỉ có vẻ xảy ra với thanh tiến trình không xác định. Tôi không biết tại sao điều này xảy ra, nhưng có lẽ bạn sẽ cảm thấy tốt hơn khi biết điều này xảy ra với người khác. Tôi đang thực hiện hầu hết các hành động tương tự như bạn, kết nối với dịch vụ web, phân tích cú pháp phản hồi xml, sau đó hiển thị phản hồi được phân tích cú pháp. FYI, tôi đang sử dụng một ProgressBar cho chức năng android:empty của ListView.

EDIT: Ran một số xét nghiệm

Tôi đã thử nghiệm phân tích các tập tin xml và với ProgressBar trong cách bố trí tôi nhận điều này:

Parse time: 94785 ms

Vì vậy, tôi đã thay đổi này

<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"/> 

để điều này

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

và nhận này Parse time: 2642 ms

Lưu ý: tôi ProgressBarListView đang ở trong một LinearLayout và tất cả các phân tích được thực hiện trong một AsyncTask. Đây là tất cả trên trình mô phỏng. Thực sự lạ ... Tôi đoán là giả lập không thực sự tách các chủ đề khỏi giao diện người dùng, do đó, việc quay AsyncTaskProgressBar đang chiến đấu cho chu kỳ CPU, trong khi trên điện thoại thực tế nó hoạt động như dự định vì nó không được mô phỏng.

Chỉnh sửa: Vì vậy, sau khi xem TaskManager trên WinXP của tôi, trình mô phỏng bắt đầu với 7 luồng đang chạy.Tôi khởi chạy ứng dụng của mình, chạy qua một số sốsử dụng AsyncTask.THREAD_POOL_EXECUTOR và số lượng chuỗi không bao giờ thay đổi từ 7 (trong Trình quản lý tác vụ) trong toàn bộ quá trình này.

+0

Tôi vừa mới đăng bài về một vấn đề tương tự khi tôi thấy chủ đề này. Tôi thấy điều tương tự trong trình giả lập 4.4.2 của tôi. AsyncTask mà tôi đang gọi và nhận phản hồi từ bài đăng http tăng từ 1-2 giây lên 80-90 giây chỉ khi tôi thêm progessBar vào chế độ xem. Nó không xuất hiện với BlueStacks đang chạy trên Windows, vì vậy tôi khuyên người khác nên kiểm tra BlueStacks nếu họ không có thiết bị Android để kiểm tra. – ScottyB

Các vấn đề liên quan