Reputation: 7191
I have application which is connected with webservice. When I start application I call class:
public class CaApplication extends Application {
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
DataRetrieve dr ;
ProgressDialog progressBar;
progressBar = new ProgressDialog(this);
//progress bar orientation
progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// Text that will appear on the progress bar dialog
progressBar.setMessage("Loading...");
//set whether the progress bar is cancelable or not
progressBar.setCancelable(false);
progressBar.show();
dr = new DataRetrieve();
}
}
I get Error:
11-25 15:39:36.698: E/AndroidRuntime(30429): Caused by: 11-25 15:39:36.698: E/AndroidRuntime(30429): java.lang.RuntimeException: Unable to create application com.example.storeclientdropdown.CambiumApplication: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
11-25 15:39:36.698: E/AndroidRuntime(30429): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3974)
11-25 15:39:36.698: E/AndroidRuntime(30429): at android.app.ActivityThread.access$1300(ActivityThread.java:127)
11-25 15:39:36.698: E/AndroidRuntime(30429): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
11-25 15:39:36.698: E/AndroidRuntime(30429): at android.os.Handler.dispatchMessage(Handler.java:99)
11-25 15:39:36.698: E/AndroidRuntime(30429): at android.os.Looper.loop(Looper.java:137)
11-25 15:39:36.698: E/AndroidRuntime(30429): at android.app.ActivityThread.main(ActivityThread.java:4441)
11-25 15:39:36.698: E/AndroidRuntime(30429): at java.lang.reflect.Method.invokeNative(Native Method)
11-25 15:39:36.698: E/AndroidRuntime(30429): at java.lang.reflect.Method.invoke(Method.java:511)
11-25 15:39:36.698: E/AndroidRuntime(30429): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-25 15:39:36.698: E/AndroidRuntime(30429): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-25 15:39:36.698: E/AndroidRuntime(30429): at dalvik.system.NativeStart.main(Native Method)
11-25 15:39:36.698: E/AndroidRuntime(30429): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
11-25 15:39:36.698: E/AndroidRuntime(30429): at android.view.ViewRootImpl.setView(ViewRootImpl.java:517)
11-25 15:39:36.698: E/AndroidRuntime(30429): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301)
11-25 15:39:36.698: E/AndroidRuntime(30429): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
11-25 15:39:36.698: E/AndroidRuntime(30429): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
11-25 15:39:36.698: E/AndroidRuntime(30429): at android.app.Dialog.show(Dialog.java:278)
11-25 15:39:36.698: E/AndroidRuntime(30429): at com.example.storeclientdropdown.CambiumApplication.onCreate(CambiumApplication.java:35)
11-25 15:39:36.698: E/AndroidRuntime(30429): at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969)
11-25 15:39:36.698: E/AndroidRuntime(30429): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3971)
11-25 15:39:36.698: E/AndroidRuntime(30429): ... 10 more
In DataRetrive I get all data from webservice and after that I call MainActivity.
What is wrong and how I can fix this bug. I try: progressBar = new ProgressDialog(this);
, progressBar = new ProgressDialog(getApplicationContext());
, progressBar = new ProgressDialog(getBaseContext);
but no result.
Upvotes: 0
Views: 83
Reputation: 12587
Application
is NOT Context
, you cannot use it as a base for a Dialog.
what you should do is in the MainActivity (meaning the first activity that runs) is to start the ProgressBar instead of doing this in the Application level.
try reading some of the great documentation in the developers site
EDIT:
from what I understand, you are trying to create a splash screen that will do work before the actual app starts.
this is a very simple thing to do and should be done like this:
public class SplashScreen extends Activity {
@Override
public void onCreate() {
super.onCreate();
DataRetrieve dr ;
ProgressDialog progressBar;
progressBar = new ProgressDialog(this);
//progress bar orientation
progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// Text that will appear on the progress bar dialog
progressBar.setMessage("Loading...");
//set whether the progress bar is cancelable or not
progressBar.setCancelable(false);
progressBar.show();
dr = new DataRetrieve(); // THIS SHOULD BE DONE IN AN AsyncTask
// WHEN DATA IS DONE RETRIEVING
progressBar.dismiss();
Intent startApp = new Intent(SplashScreen.this, MainActivity.class);
startActivity(startApp);
finish();
}
}
Upvotes: 4
Reputation: 2186
As was mention by @thepoosh, Application is not a context. Also, if you're looking to do this just once when the application is fired up then put this code in one function in your default activity (the first one that'll appear), and call this function in onCreate()
. ALSO, if it's a blocking task you're performing then put it in another Thread
, and dismiss the ProgressDialog once you're done computing or downloading.
If you want to do this only the first time the application is started, and not each time your first activity opens (owing to user traversing back and forth), then maintain a static flag which is set once the download completes, and is not updated until another download is needed.
Upvotes: 0