hi! first of all, i have to admit that i was wrong. when you set Dialog#setCancelable(false), hit home button, rerun your app, then your progress dialog does not always work. so i'm still stuck :/
@Broc Seib: thank you for your response! you said that you terminate your thread when gui thread is dead. however i just want to do the opposite - i want my thread to be alive while gui is gone. and when gui is restarted, it should still be able to receive messages from running thread. do know if that can be achieved without creating service with thread and binding to it? On Sep 28, 4:43 am, Broc Seib <[email protected]> wrote: > I have built progress bars where I hay d a background thread that updated my > Activity via callbacks (to do GUI updates in the UI thread). > > I ended up using a WeakReference object to hold the callback pointer to my > Activity. I have made the assumption (right or wrong) that my UI thread may > be gone while my background thread still exists. I was experiencing some > funky exceptions while testing my app -- I was rudely interrupting my > application by pressing the back or home button in the middle of my > background thread doing some non-GUI work. > So when it is time for my background thread to report to my UI thread, if my > WeakReference returns null, then I just silently exit my thread in the > background, knowing my UI thread is gone. > > Below is a canonical example demonstrating what I am doing. There may be > more suitable solutions that I have not learned yet. > -broc > > package foo.example; > > import java.lang.ref.WeakReference; > > public class BackgroundThreadExample extends Thread { > public interface Callback { > public void onSomeBadEventUpdateGuiThread(Object stuff); > public void onSomeGoodEventUpdateGuiThread(Object things); > > } > > private WeakReference<Callback> weakCallback; > private Object stuffYouCareAbout; > public BackgroundThreadExample(Callback callback, Object stuffYouCareAbout) > { > super("myThreadName"); > this.weakCallback = new WeakReference<Callback>(callback); > this.stuffYouCareAbout = stuffYouCareAbout;} > > �...@override > public void run() { > // do background stuff > boolean isGood = doStuff(this.stuffYouCareAbout); > try { > // inform our UI via callback. > if ( isGood ) { > getCallback().onSomeGoodEventUpdateGuiThread("was good");} else { > > getCallback().onSomeBadEventUpdateGuiThread("was bad");} > } > > catch (MyWeakRefException e) { > // our UI thread object is gone. bummer. > // silently fall thru to exit this thread. > > } > } > > private boolean doStuff(Object stuffYouCareAbout) { > // some useful stuff might go here. > return true;} > > private Callback getCallback() throws MyWeakRefException { > Callback callback = weakCallback.get(); > if ( callback == null ) { > throw new MyWeakRefException(); > > } else { > return callback; > } > } > } > On Sat, Sep 26, 2009 at 8:17 PM, Kacper86 <[email protected]> wrote: > > > Thank you for your response! It works great - now I can change the > > orientation and the ProgressDialog works. And do have any ideas how to > > solve the problem with user hitting "back" or "home" button? I found > > that you may set your Dialog with Dialog#setCancelable(false). Then, > > the user can only hit "home" button, and when he launches the app > > again, ProgressDialog is still there! > > > However, what should be done if I want Dialog that can be cancelable? > > So that the user can cancel ProgressDialog, set something in the app > > settings, hit "home" button, run sth else, and then relaunch my app to > > check the progress? > > > On Sep 26, 11:36 am, manoj <[email protected]> wrote: > > > You need to implement the method > > > public void onConfigurationChanged(Configuration arg0) > > > { > > > super.onConfigurationChanged(arg0); > > > } > > > > in your activity. and in manifest file, you have to the statement > > > android:configChanges="keyboardHidden|orientation" for that activity. > > > > so when your screen orientation is changed, it wont call the onCreate > > > () method again. > > > > On Sep 26, 1:21 pm, Kacper86 <[email protected]> wrote: > > > > > Hi! > > > > > I've created ProgressDialog with a second thread according to the > > > > DevGuide: > > >http://developer.android.com/guide/topics/ui/dialogs.html#ProgressDialog > > > > It works great till user: > > > > > 1) changes screen orientation or > > > > 2) hits the back button twice (first to hide the dialog, second to > > > > hide the app) to hide the application and run the app again after a > > > > while. > > > > > Then, onCreate() is called (for the second time), and progress bar > > > > stops responding properly. My thread may work for a few minutes and I > > > > want to give the user possibility to hide it and do sth else. After a > > > > while he might want to run the app again in order to check the > > > > progress. > > > > > I found a few articles concerning this topic, but I couldn't find the > > > > exact solution I should chose for this problem. So, could you tell mi > > > > what is the proper way to handle this? Should i save the handler and > > > > dialog state with "onRetainNonConfigurationInstance()"? If so, how to > > > > do it properly and is it safe? > > > > > Or maybe my solution is wrong and I should create service, which > > > > spawns the thread and communicates with activity (progress bar) with > > > > AIDL? But this will mean that the article in DevGuide is wrong, cause > > > > it doesn't give a long term solution for creating a progress bar... > > > > > I'm stuck, and I'd appreciate all the response! > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~----------~----~----~----~------~----~------~--~---

