0

我有与 web 服务连接的应用程序。当我启动应用程序时,我调用类:

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 中,我从 web 服务获取所有数据,然后调用 MainActivity。出了什么问题以及如何修复此错误。我尝试:progressBar = new ProgressDialog(this);, progressBar = new ProgressDialog(getApplicationContext());progressBar = new ProgressDialog(getBaseContext);但没有结果。

4

2 回答 2

4

Application不是Context,您不能将其用作对话框的基础。

您应该在 MainActivity(即运行的第一个活动)中启动 ProgressBar,而不是在 Application 级别执行此操作。

尝试阅读开发者网站上的一些优秀文档

编辑:

据我了解,您正在尝试创建一个启动屏幕,该屏幕将在实际应用程序启动之前起作用。

这是一件非常简单的事情,应该这样做:

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();
    }
}
于 2012-11-25T14:53:17.677 回答
0

正如@thepoosh 提到的,应用程序不是上下文。此外,如果您只想在应用程序启动时执行此操作,则将此代码放在默认活动中的一个函数中(将出现的第一个函数),然后在onCreate(). 另外,如果它是您正在执行的阻塞任务,则将其放入另一个Thread中,并在您完成计算或下载后关闭 ProgressDialog。

如果您只想在应用程序第一次启动时执行此操作,而不是每次您的第一个活动打开时(由于用户来回遍历),请维护一个静态标志,该标志在下载完成后设置,并且不更新直到需要再次下载。

于 2012-11-25T15:07:42.670 回答