我有与webservice连接的应用程序。 当我开始申请时,我打电话给上课:
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();
}
}
我收到错误:
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
在DataRetrive中,我从webservice获取所有数据,之后我调用MainActivity。
有什么问题以及如何解决这个问题。我尝试:progressBar = new ProgressDialog(this);
,progressBar = new ProgressDialog(getApplicationContext());
,progressBar = new ProgressDialog(getBaseContext);
,但没有结果。
答案 0 :(得分:4)
Application
不是Context
,您不能将其用作对话框的基础。
你应该做的是在MainActivity中(意味着第一个运行的活动)是启动ProgressBar而不是在应用程序级别执行此操作。
尝试阅读部分great documentation in the developers site
<强> 编辑: 强>
根据我的理解,您正在尝试创建一个在实际应用启动之前可以正常工作的启动画面。
这是一件非常简单的事情,应该这样做:
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();
}
}
答案 1 :(得分:0)
如@thepoosh所述,应用程序不是上下文。此外,如果您希望在应用程序启动时只执行一次,则将此代码放在默认活动中的一个函数中(第一个将出现),并在onCreate()
中调用此函数。此外,如果它是您正在执行的阻止任务,则将其放入另一个Thread
,并在完成计算或下载后关闭ProgressDialog。
如果您只想在第一次启动应用程序时执行此操作,而不是每次打开第一个活动时(由于用户来回移动),请保留一个静态标志,该标志在下载完成后设置,并且在需要下载之前不会更新。