2010-11-17 30 views
5

Đây là bài viết ngăn xếp ngăn xếp nắm tay của tôi vì vậy hãy nhẹ nhàng với tôi! Tôi chắc chắn rằng những gì tôi đang cố gắng làm là có thể và nó là cái gì tôi đã làm (hoặc không được thực hiện?) Đó là gây ra vấn đề ... Tôi chỉ không chắc chắn rằng những gì một cái gì đó là.Android ProgressDialog wont spin

gì tôi đang cố gắng để làm:
Hiển thị ProgressDialog trong khi đồng bộ ứng dụng của tôi và xử lý các dữ liệu tải về.

Vấn đề:
Các chương trình ProgressDialog nhưng không quay (mà làm cho nó trông giống như nó đã bị đóng băng), đồng bộ hóa và xử lý xảy ra, ProgressDialog đóng lại, các ứng dụng vẫn tiếp tục như bình thường.

Làm thế nào tôi hiện đang Tring để làm điều đó:
Tạo một ProgressDialog - trong Hoạt động của tôi
Làm đồng bộ hóa - trong Dịch vụ của tôi
Process dữ liệu - trong Dịch vụ của tôi
Dismis các ProgressDialog - trong tôi hoạt động

Những điều tôi đã cố gắng:
Sử dụng một Thread (mã bên dưới) Sử dụng một AsynTask (có thể cung cấp mã nếu cần) 0.123.Sử dụng Trình xử lý (có thể cung cấp mã nếu cần)

Sau khi dành nhiều thời gian tìm kiếm câu trả lời cho câu hỏi của tôi, có vẻ như những người khác đã gặp sự cố tương tự hoặc tương tự và đã giải quyết nó bằng một trong các ý tưởng ở trên. Tuy nhiên tôi đã không thể thực hiện bất kỳ ý tưởng nào trong số này để giải quyết vấn đề cụ thể của tôi. Điều này làm cho tôi chắc chắn rằng nó là cái gì tôi đang làm sai ... Tôi chỉ không chắc chắn những gì.

Mã ban đầu tôi đã viết và đang sử dụng làm cơ sở cho tất cả các bản sửa lỗi cố gắng của tôi:
Đầu tiên

public class myActivity extends ListActivity { 
    private ProgressDialog dialog; 
    private boolean mIsBound; 
    private myService mBoundService; 
    private ServiceConnection mConnection; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     /*if we need to login start login activity for result*/ 
     ... 
    } 

    ... 
    /*other methods*/ 
    ... 
} 

sau đó

protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    switch (requestCode){ 
     case ACTIVITY_LOGIN: 
      /*after login we know we always need to sync*/ 
     dialog = new ProgressDialog(myActivity.this); 
     dialog.setMessage("Synchronising..."); 
     dialog.setIndeterminate(true); 
     dialog.setCancelable(false); 
     dialog.show(); 

      Thread doBind = new Thread(new Runnable(){public void run(){doBindService();}}); 
      doBind.start(); 
      break; 
    } 
} 

vì vậy bây giờ tôi đang giả định rằng doBind đang xảy ra trong một chủ đề khác nhau để lại các chủ đề giao diện người dùng với không có gì để làm khác hơn là hiển thị ProgressDialogue ...?

private boolean doBindService() { 
mConnection = new ServiceConnection() { 
     public void onServiceConnected(ComponentName className, IBinder service) { 
      mBoundService = ((myService.LocalBinder)service).getService();  
      while (mBoundService.isRunning()){ 
       /*wait for service to finish before doing anything else... myMethod() is expecting the sync to have completed*/ 
       /*I suspect this loop to be the thing causing the problem. But I'm not sure why because it is in a different thread so shouldn't interfear with the dialog?! And if that is what is causing the problem then how else can I do this?*/ 
      } 
      /*get the activity to do Stuff with the downloaded data*/ 
      myMethod(); 
      /*finished with the service for now so unbind*/ 
      doUnbindService(); 
      if (dialog != null) { 
       dialog.dismiss(); 
      } 
     } 

     public void onServiceDisconnected(ComponentName className) { 
      mBoundService = null; 
     } 
    }; 

    boolean myReturn = bindService(new Intent(myActivity.this, myService.class), mConnection, Context.BIND_AUTO_CREATE); 
    mIsBound = myReturn; 
return myReturn; 
} 

private void doUnbindService() { 
    if (mIsBound) { 
     unbindService(mConnection); 
     mIsBound = false; 
    } 
} 

Vui lòng cho tôi biết nếu bạn cần thêm bất kỳ thông tin nào để hỗ trợ tôi về vấn đề này.


EDIT:

Đây là mã tôi đang sử dụng để sử dụng một trình xử lý để thay thế. Điều này sẽ hiển thị cùng một hành vi (spinner không spin) như trước.

Thread doBind = new Thread(new Runnable(){ 
    public void run(){ 
     doBindService(); 
    } 
}); 
doBind.start(); 

.

private Handler handler = new Handler() { 
    @Override 
public void handleMessage(Message msg) { 
    dialog.dismiss(); 
} 
}; 

.

private boolean doBindService() { 
mConnection = new ServiceConnection() { 
     public void onServiceConnected(ComponentName className, IBinder service) { 
      mBoundService = ((myService.LocalBinder)service).getService();  
      while (mBoundService.isRunning()){ 
      } 
      //...do stuff same as before... 
      handler.sendEmptyMessage(0); 
     } 

     public void onServiceDisconnected(ComponentName className) { 
      mBoundService = null; 
     } 
    }; 

    boolean myReturn = bindService(new Intent(myActivity.this, myService.class), mConnection, Context.BIND_AUTO_CREATE); 
    mIsBound = myReturn; 
return myReturn; 
} 
+0

Tôi thấy hành vi đóng băng tương tự này trên hộp thoại tiến trình của mình. Nó thường là khi công việc gần như hoàn thành và hộp thoại sắp đóng lại. Bao lâu là hộp thoại của bạn lên? Nếu bạn làm cho chủ đề ngủ trong một vài giây, điều đó có làm cho hộp thoại quay không? – softarn

+0

Tôi có một vấn đề tương tự với ProgressDialog mà tôi đã hỏi ở đây: http://stackoverflow.com/questions/3821306/progressdialog-created-from-oncreatedialog-stops-animating-on-second-run. Tôi nghĩ rằng có một lỗi trong codebase Android. – ageektrapped

+0

@softarn: Cảm ơn bạn đã đề xuất. Nếu tôi làm: Chủ đề doBind = new Thread (new Runnable() { \t public void run() { \t try { \t \t \t Thread.sleep (10000); \t \t} catch (InterruptedException e) { \t \t \t e.printStackTrace(); \t \t} doBindService(); \t} }); Hộp thoại quay trong 10 giây sau đó đóng băng trong 3 đến 4 giây trước khi biến mất ... – John

Trả lời

2

Vấn đề với spinner có liên quan đến ServiceConnection mà bạn tạo ra trong các chủ đề mới. Thật không may cho bạn, điều này sẽ được chạy trên thread thread/gui chính của bạn.

Từ tài liệu tham khảo API: (http://developer.android.com/reference/android/content/ServiceConnection.html)

Giống như nhiều callbacks từ hệ thống, các phương pháp trên lớp này là được gọi là từ chủ đề chính của quy trình của bạn.

Vì vậy, vì tôi không quen với dịch vụ, tôi chỉ có thể đoán rằng một cách giao tiếp khi dịch vụ của bạn tải xuống dữ liệu là phát một ý định mà bạn lắng nghe trong Hoạt động của mình rồi dừng ProgressDialog. Nhưng chắc chắn có những cách khác nữa.

Và như một lưu ý phụ, bạn không bao giờ sửa đổi gui từ bất kỳ chủ đề nào khác, sau đó là chuỗi chính mà bạn đang cố gắng thực hiện bằng cách sinh ra một Chủ đề mới cố gắng loại bỏ hộp thoại. Bạn chỉ nên loại bỏ hộp thoại khỏi chuỗi chính.

+0

Tôi đang điều tra đề xuất của bạn (gửi và phản hồi với mục đích) và tại thời điểm này, có vẻ như đây là câu trả lời cho vấn đề của tôi. Howerver bạn nói trong bài viết của bạn "có chắc chắn những cách khác là tốt." ... Những cách khác này là gì? Có bất kỳ cách nào trong số này là cách tốt hơn để làm điều này không? – John

+0

Sử dụng đề xuất của bạn Tôi tìm thấy bài đăng này: http://stackoverflow.com/questions/2843874/in-android-how-to-call-function-of-activity-from-a-service và bây giờ có một ứng dụng đang hoạt động. Cảm ơn bạn đã giúp đỡ! – John

0

Hay bạn có thể thử sử dụng Trình xử lý?

Tôi nghĩ rằng bạn nên làm điều này bằng cách sử dụng Handler chức năng của Android

+0

Xin chào. Cảm ơn đề xuất của bạn. Tôi đã cố gắng thực hiện một xử lý để làm điều này nhưng tôi không rõ ràng về nơi mà các cuộc gọi đến nó nên được và những gì nó thực sự nên làm. Triển khai hiện tại của tôi vẫn hiển thị cùng một sự cố như được mô tả khi sử dụng chuỗi. Tôi đã sử dụng ví dụ như được thấy trên http://www.helloandroid.com/tutorials/using-threads-and-progressdialog. Tôi sẽ chỉnh sửa bài đăng gốc của mình và thêm mã tôi đã thử. Nếu bạn có thể có một cái nhìn và xem những gì tôi đang làm sai tôi sẽ đánh giá cao nó. – John

0
public class yourclass extends Activity implements Runnable { 

    static ProgressDialog progressDialog; 

    @Override 
    public void onCreate(Bundle icicle) { 
       progressDialog = ProgressDialog.show(keywordview.this, "", "Loading...", true); 
       Thread thread = new Thread(keywordview.this); 

    } 
    final Handler handler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 
      progressDialog.dismiss(); 
     /*Here you can handle you process*/ 
     } 
    }; 

    public void run() { 
     //here your code for run 
     handler.sendEmptyMessage(0); 
    } 
} 
Các vấn đề liên quan