2010-11-17 10 views
5

यह मेरी मुट्ठी स्टैक ओवरफ्लो पोस्ट है इसलिए कृपया मेरे साथ सौम्य रहें! मुझे यकीन है कि जो मैं करने की कोशिश कर रहा हूं वह संभव है और यह कुछ ऐसा है जो मैंने किया है (या नहीं किया?) जो समस्या पैदा कर रहा है ... मुझे यकीन नहीं है कि कुछ है।एंड्रॉइड प्रोग्रेसडिअलॉग स्पिन

क्या मुझे क्या करना कोशिश कर रहा हूँ:
एक ProgressDialog दिखाएँ मेरे ऐप सिंक्रनाइज़ करता है और डाउनलोड किए गए डेटा को संसाधित करता है।

समस्या:
ProgressDialog शो लेकिन स्पिन नहीं करता है (जो बनाता है यह देखने के लिए की तरह यह जम गया है), तुल्यकालन और प्रसंस्करण होता है, ProgressDialog बंद कर देता है, एप्लिकेशन सामान्य रूप में जारी है।

कैसे मैं वर्तमान में करने के लिए कि tring हूँ:
एक ProgressDialog बनाएँ - मेरे गतिविधि
तुल्यकालन करो में - मेरी सेवा
Dismis ProgressDialog में - - मेरी सेवा
प्रक्रिया डेटा में में मेरे गतिविधि

बातें मैं कोशिश की है:
(नीचे कोड) एक AsynTask का उपयोग करते हुए एक सूत्र का उपयोग करना (यदि आवश्यक कोड प्रदान कर सकते हैं) 0,123,एक हैंडलर का उपयोग करना (यदि आवश्यक हो तो कोड प्रदान कर सकते हैं)

मेरे प्रश्न के उत्तर की खोज करने में बहुत समय व्यतीत करने के बाद ऐसा लगता है कि दूसरों के पास समान या समान समस्या है और इसे उपरोक्त विचारों में से किसी एक का उपयोग करके हल करने में कामयाब रहा है। हालांकि मैं अपने विशेष मुद्दे को हल करने के लिए इनमें से किसी भी विचार को लागू करने में असमर्थ रहा हूं। यह मुझे यकीन दिलाता है कि यह कुछ है जो मैं गलत कर रहा हूं ... मुझे यकीन नहीं है कि क्या।

मूल कोड मैंने लिखा और मेरे सारे प्रयास किया सुधार के लिए एक आधार के रूप उपयोग कर रहा हूँ:
पहले

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*/ 
    ... 
} 

तो

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; 
    } 
} 
तो

अब मैं यह सोचते हैं कि doBind हो रहा है यूआर थ्रेड को छोड़कर एक अलग थ्रेड में प्रोग्रेसडिअलॉग दिखाने के अलावा कुछ भी करने के लिए ...?

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; 
    } 
} 

कृपया मुझे बताएं कि आपको इस मुद्दे के साथ मेरी सहायता करने के लिए किसी और जानकारी की आवश्यकता है या नहीं।


संपादित करें:

यहाँ कोड मैं बजाय एक हैंडलर का उपयोग करने के लिए उपयोग कर रहा हूँ है। यह पहले जैसा ही व्यवहार करता है (स्पिनर स्पिन नहीं करता)।

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

मुझे अपने प्रगति संवाद पर यह वही ठंडा व्यवहार दिखाई देता है। आमतौर पर जब कार्य लगभग समाप्त हो जाता है और संवाद बंद होने वाला होता है। आपका संवाद कितना समय तक है? यदि आप धागे को कुछ सेकंड के लिए सोते हैं, तो क्या यह संवाद स्पिन करता है? – softarn

+0

मुझे प्रोग्रेसडिअलॉग के साथ एक ही समस्या है जिसे मैंने यहां पूछा: http://stackoverflow.com/questions/3821306/progressdialog-created-from-oncreatedialog-stops-animating-on-second-run। मुझे लगता है कि एंड्रॉइड कोडबेस में एक बग है। – ageektrapped

+0

@ सॉफ़्टर्न: सुझाव के लिए धन्यवाद। अगर मैं कार्य करें: थ्रेड doBind = नया थ्रेड (नई Runnable() { \t सार्वजनिक शून्य रन() { \t कोशिश { \t \t \t Thread.Sleep (10000); \t \t} पकड़ (InterruptedException ई) { \t \t \t e.printStackTrace(); \t \t} doBindService(); \t} }); 10 सेकेंड के लिए संवाद स्पिन तो असंतोष से पहले 3 से 4 सेकंड तक जमा हो जाता है ... – John

उत्तर

2

स्पिनर के साथ समस्या यह ServiceConnection जो आप नए सूत्र में बनाने से संबंधित है के हैंडलर समारोह का उपयोग करके ऐसा करना चाहिए। दुर्भाग्य से आपके लिए, यह आपके मुख्य धागे/गुई धागे पर चलाया जाएगा।

API संदर्भ से: (http://developer.android.com/reference/android/content/ServiceConnection.html)

सिस्टम से कई कॉलबैक की तरह, इस वर्ग पर तरीके हैं आपकी प्रक्रिया के मुख्य धागे से कहा जाता है।

इसलिए, चूंकि मैं सेवाओं से परिचित नहीं हूं, मैं केवल अनुमान लगा सकता हूं कि जब आपकी सेवा डाउनलोड की जाती है तो संचार करने का एक तरीका यह होगा कि आप अपनी गतिविधि में जो इरादा सुनते हैं, उसे प्रसारित करना होगा और फिर रोकें ProgressDialog। लेकिन निश्चित रूप से अन्य तरीके भी हैं।

और एक साइड नोट के रूप में, आपको कभी भी मुख्य धागे के किसी अन्य थ्रेड से गुई को संशोधित नहीं करना चाहिए, जिसे आप एक नया थ्रेड बनाने के द्वारा करने की कोशिश कर रहे हैं जो संवाद को खारिज करने का प्रयास करता है। आपको केवल मुख्य धागे से संवाद को खारिज कर देना चाहिए।

+0

मैं आपके सुझाव की जांच कर रहा हूं (एक इरादे को भेजना और प्रतिक्रिया देना) और फिलहाल ऐसा लगता है कि यह मेरी समस्या का उत्तर है। आप अपनी पोस्ट में कहें तो "निश्चित रूप से अन्य तरीके भी हैं।" ... इन अन्य तरीकों क्या हैं? क्या इनमें से कोई भी ऐसा करने का "बेहतर" तरीका होगा? – John

+0

आपके सुझाव का उपयोग करके मुझे यह पोस्ट मिला: http://stackoverflow.com/questions/2843874/in-android-how-to-call-function-of-activity-from-a- सेवा और अब एक कार्यरत ऐप है। आपकी सहायताके लिए धन्यवाद! – John

0

क्या आप हैंडलर का उपयोग करने का प्रयास कर सकते हैं?

मुझे लगता है कि आप एंड्रॉयड

+0

हाय। तुम्हारे सुझाव के लिए धन्यवाद। मैंने ऐसा करने के लिए एक हैंडलर को लागू करने का प्रयास किया है, लेकिन मैं इस बात पर स्पष्ट नहीं हूं कि कॉल कहां होना चाहिए और वास्तव में क्या करना चाहिए। मेरा वर्तमान कार्यान्वयन अभी भी एक ही समस्या को प्रदर्शित करता है जैसा कि धागे का उपयोग करते समय वर्णित है। मैंने http://www.helloandroid.com/tutorials/using-threads-and-progressdialog पर उदाहरण के रूप में उदाहरण का उपयोग किया। मैं अपनी मूल पोस्ट संपादित करूंगा और जिस कोड को मैंने कोशिश की है उसे जोड़ दूंगा। यदि आप एक नज़र डाल सकते हैं और देख सकते हैं कि मैं क्या गलत कर रहा हूं तो मैं इसकी सराहना करूंगा। – 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); 
    } 
} 
संबंधित मुद्दे