2011-02-01 54 views
20

Tôi có một ListActivity sẽ khởi chạy một số Activity khác dựa trên lựa chọn danh sách. Điều này Activity thứ hai cần phải tải một chút công bằng của dữ liệu từ internet và như vậy có một sự chậm trễ đáng chú ý giữa khi người dùng nhấp vào một mục và khi các màn hình Activity. Đây là vấn đề bởi vì hiện tại tôi không có cách nào để chỉ ra cho người dùng biết rằng nhấp chuột của họ đang được xử lý (thậm chí chỉ thay đổi màu của mục danh sách được chọn sẽ đủ nhưng tôi không thể tìm được cách tốt để làm cái đó). Lý tưởng nhất là tôi có thể hiển thị một số không xác định ProgressDialog trong khi tải Activity thứ hai.Hiển thị thanh tiến trình khi Hoạt động đang tải

Tôi đã thử một vài cách tiếp cận khác nhau cho điều này nhưng dường như không có gì hoạt động như mong muốn.


Tôi đã thử những điều sau đây:

  • Lấy dữ liệu serializable (không phải tất cả của nó nhưng một số phần) trong một AsyncTask trong Activity đầu tiên và đi qua nó như một bổ sung cho các lần thứ hai. Điều này không thực sự làm việc tốt như một ProgressDialog Tôi tạo ra trong onPreExecute() không hiển thị ngay lập tức (có vẻ như trì hoãn bởi việc xử lý được thực hiện trong doInBackground() đối với một số lý do.)

Đây là mã cho rằng:

AsyncTask<String, Void, String> read = new AsyncTask<String, Void, String>() { 
    Dialog progress; 

    @Override 
    protected void onPreExecute() { 
     progress = ProgressDialog.show(SearchActivity.this, 
       "Loading data", "Please wait..."); 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     DatasetReader reader = new DatasetReader(); 
     reader.setFundID(params[0]); 
     reader.addDatsets(FundProfile.datasets); 
     reader.populate(); 
     return reader.toString(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     progress.dismiss(); 
    } 
}; 
read.execute(selectedItem.getUniqueID()); 
try { 
    action = new Intent(SearchActivity.this, FundProfile.class); 
    action.putExtra("data", read.get()); 
} catch(Exception ex) { 
    ex.printStackTrace(); 
} 
  • Trong phương pháp này hoạt động thứ hai của onCreate() (điều này không làm việc ở tất cả):

    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
    setProgressBarVisibility(true);

Dưới đây là phương pháp onCreate() cho cách tiếp cận thứ hai:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.setTitleColor(Color.WHITE); 
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
    setProgressBarVisibility(true); 

    try { 
     setContentView(R.layout.fund_profile); 
     // init some data 
     setProgressBarVisibility(false); 
    } catch(Exception ex) { 
     FundProfile.this.finish(); 
    } 
} 
+1

Bạn đã thử phương pháp tiếp cận nào khác nhau? Bạn có thể chia sẻ nỗ lực của mình không? – Cristian

+0

Tôi ngạc nhiên khi cách tiếp cận đầu tiên không hiệu quả. Một 'ProgressDialog' được hiển thị trong' onPreExecute() 'không nên được giữ bởi mã trong' doInBackground() ', có lẽ có một số vấn đề khác với mã của bạn? –

+0

Có thể? Tôi đã thêm mã có liên quan .. – Adam

Trả lời

16

Nếu bạn có hoạt động lâu dài, bạn không nên thực hiện chúng trong onCreate trong mọi trường hợp vì điều này sẽ đóng băng giao diện người dùng (cho dù hoạt động có được hiển thị) hay không. Giao diện người dùng được đặt bởi onCreate sẽ không xuất hiện và giao diện người dùng sẽ không phản hồi cho đến khi lệnh gọi onCreate kết thúc.

Có vẻ như bạn có thể bắt đầu hoạt động thứ hai và hiển thị thanh tiến trình (hoặc requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);), sau đó khởi động ASyncTask sẽ chịu trách nhiệm cập nhật giao diện người dùng của bạn khi dữ liệu đã được truy lục.

+0

Vâng, tôi đã tìm ra cách thích hợp để làm điều đó (tải dữ liệu trong một chủ đề khác), nhưng tôi muốn tránh nó bây giờ .. nhưng tôi cắn viên đạn và làm theo cách này (AsyncTask làm cho điều này ít đau đớn hơn nó có thể có được ..) – Adam

2

Adam,

Có vẻ như bạn đang tìm kiếm thanh Progress Không xác định: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar2.html

Bạn có thể hiển thị trong khi điều này bạn đang tải số Activity thứ hai sau đó đặt chế độ hiển thị thành sai khi số Activity thứ hai đã tải dữ liệu của nó.

+0

Tôi đã thử điều đó, nhưng nó dường như không hoạt động đối với tôi. – Adam

+0

Bạn có thấy nó không? Chính xác thì điều gì không hiệu quả? –

+0

Chế độ xem hoạt động đầu tiên vẫn nằm trên màn hình cho đến khi toàn bộ phương thức onCreate() hoàn tất, vì vậy tôi không bao giờ thấy thanh tiến trình. – Adam

3

Move tạo tiếp cận mục đích - và thực sự bất cứ điều gì bạn cần làm sau khi hoàn thành AsyncTask - thành onPostExecute:

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    progress.dismiss(); 
    Intent action = new Intent(SearchActivity.this, FundProfile.class); 
    action.putExtra("data", result); 
    // ... do more here 
} 

Vấn đề là AsyncTask.get() blocks cho đến khi công việc được hoàn tất.Vì vậy, trong đoạn mã trên, chuỗi giao diện người dùng bị chặn và ProgressDialog không bao giờ có cơ hội xuất hiện cho đến khi tác vụ hoàn tất.

+0

Ah, điều đó giải thích lý do tại sao mà không làm việc .. – Adam

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