2010-11-23 33 views
7

hey guys, Tôi gặp sự cố với hộp thoại tiến trình khi mở hoạt động (gọi là hoạt động 2 chẳng hạn). Hoạt động 2 có nhiều mã để thực thi trong sự kiện OnCreate này.Hộp thoại tiến trình về hoạt động mở

final ProgressDialog myProgressDialog = ProgressDialog.show(MyApp.this,getString(R.string.lstAppWait), getString(R.string.lstAppLoading), true); 
new Thread() { 
    public void run() { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       showApps(); 
      } 
     }); 
     myProgressDialog.dismiss(); 
    } 
}.start(); 

Chức năng showApps ra mắt hoạt động 2.

nếu tôi thực thi mã này trên sự kiện nhấn nút của tôi về hoạt động 1, tôi thấy sự tiến bộ, nhưng cô không di chuyển và afeter tôi có một màn hình màu đen trong 2 hoặc 3 giây thời gian cho android để hiển thị hoạt động.

Nếu tôi thực thi mã này trong OnCreate of Activity2 và nếu tôi thay thế showApps bằng mã trên OnCreate, Activity1 đóng băng 2 giây, tôi không thấy hộp thoại tiến trình và đóng băng lại 2 giây trên hoạt động 2 trước khi xem kết quả.

Ý tưởng?

+0

Bạn tạo một chủ đề mà sẽ chạy mã mà chạy trong UI Chủ đề ?! Đây có phải là một hack/workaround tôi cần phải biết hoặc là điều này chỉ là sai? – WarrenFaith

+0

Hey @WarrenFaith, bạn có thể đá tôi một cách vững chắc và chấp nhận câu trả lời được bình chọn hàng đầu của tôi cho câu hỏi này không? –

+0

@ Darren không phải câu hỏi của tôi :) – WarrenFaith

Trả lời

10

Tôi gặp vấn đề tương tự và sử dụng AsyncTask đang hoạt động với tôi.

Có 3 phương pháp quan trọng cần ghi đè trong AsyncTask.

  1. doInBackground: đây là nơi mà thịt chế biến nền của bạn sẽ xảy ra.
  2. onPreExecute: hiển thị ProgressDialog của bạn ở đây (ShowDialog)
  3. onPostExecute: ẩn ProgressDialog của bạn ở đây (removeDialog hoặc dismissDialog )

Nếu bạn thực hiện lớp AsyncTask bạn như là một lớp bên trong hoạt động của bạn , sau đó bạn có thể gọi các phương thức khung showDialog, dismissDialog và removeDialog từ bên trong AsyncActivity của bạn.

Dưới đây là một việc thực hiện mẫu AsyncTask:

class LoginProgressTask extends AsyncTask<String, Integer, Boolean> { 
    @Override 
    protected Boolean doInBackground(String... params) { 
    try { 
     Thread.sleep(4000); // Do your real work here 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    return Boolean.TRUE; // Return your real result here 
    } 
    @Override 
    protected void onPreExecute() { 
    showDialog(AUTHORIZING_DIALOG); 
    } 
    @Override 
    protected void onPostExecute(Boolean result) { 
    // result is the value returned from doInBackground 
    removeDialog(AUTHORIZING_DIALOG); 
    Intent i = new Intent(HelloAndroid.this, LandingActivity.class); 
    startActivity(i); 
    } 
} 
2

AFAIK bạn không thể tải trước bất kỳ hoạt động nào có hộp thoại tiến trình được hiển thị. Bạn đang thử nghiệm trên một thiết bị thực hay giả lập?

Tôi đã xem các giải pháp đã mở hoạt động với ViewFlipper có hoạt ảnh tiến trình ở trung tâm và trong Chế độ xem tiếp theo, nó đã được tải một hoạt động, nhưng nó không được đề xuất và khó thực hiện muốn.

+0

Vâng tôi đã thử nghiệm trên cả hai với cùng một kết quả, nhanh hơn trên giả lập gây ra tôi khởi động một hoạt động với tất cả các ứng dụng được cài đặt, và ít trên giả lập. Hum, 2 animations không phải là comportement tôi muốn:/ – Pachanka

3

GeeXor

tôi sẽ đề nghị bạn để tránh thực hiện rất nhiều hoạt động trong Hoạt động 2 của rất nhiều OnCreate.Writing hoạt động trong OnCreate là một lý do để màn hình đen giữa activities.So thực hiện những hoạt động không đồng bộ sử dụng AsyncTask hoặc trong một Chủ đề (hoặc viết chúng trong onStart nếu chúng không thể tránh khỏi).

Đề xuất khác là bắt đầu tiến trìnhDialog khác trong hoạt động onCreate 2 sẽ chạy cho đến khi tất cả dữ liệu của bạn được tải & người dùng sẽ biết rằng có điều gì đó đang diễn ra ở chế độ nền.

+0

ok, tôi sẽ xem tối nay và opst câu trả lời, cảm ơn – Pachanka

0

đây là những gì tôi sẽ làm. tạo một trình xử lý trên chuỗi ui, bắt đầu luồng xử lý nền và sau đó hiển thị tiến trình tiến trình. khi các chủ đề nền đã hoàn thành nó làm việc nhận được nó để gửi một runnable trên thread ui thông qua xử lý để loại bỏ các hộp thoại.

+0

hum tôi đã nhìn thấy nhiều ứng dụng với một bánh xe nhỏ như trong tiến trình hộp thoại trực tiếp trong hoạt động (trên hoặc xuống trong hoạt động). Đó là gì ? – Pachanka

+0

Hãy xem 'Activity.setProgress'. Có một số tùy chọn để thiết lập bánh xe quay nhỏ trên thanh tiêu đề Hoạt động. – techiServices

+0

ok, tôi đã tìm thấy một giải pháp ở đây: http://stackoverflow.com/questions/3893626/how-to-use-asynctask-to-show-a-progressdialog-while-doing-background-work-in-andr – Pachanka

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