需要解决我的bug与上下文android

时间:2012-11-25 14:48:33

标签: android

我有与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);,但没有结果。

2 个答案:

答案 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。

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