Đâ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;
}
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
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
@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