Android:ProgressDialog.show() WindowManager token ,无效

标签 android progressdialog android-windowmanager

public class MainActivity extends Activity {

    private static String State = "STOP";

    final String address = "http://XXXX.co.uk:9994";
    private ImageView Player;
    private ProgressDialog progress;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        // requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(R.layout.activity_main);


        Button Schedule;
        Button Presenters;
        Button Image;

        Player = (ImageView) findViewById(R.id.imgStart);

        if(State != "STOP"){
            Player.setImageResource(R.drawable.stop);       
        }
        else{
            Player.setImageResource(R.drawable.start);
        }

        Schedule = (Button) findViewById(R.id.btnSchedule);
        Presenters = (Button) findViewById(R.id.btnPresenters);
        Image = (Button) findViewById(R.id.imgbutton);
        LocalBroadcastManager.getInstance(this).registerReceiver(LoadingReceiver, new IntentFilter("loading"));
        LocalBroadcastManager.getInstance(this).registerReceiver(CompletionReceiver, new IntentFilter("done"));
        LocalBroadcastManager.getInstance(this).registerReceiver(ErrorReceiver, new IntentFilter("error"));



        Player.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if(State != "PLAY"){
                    Intent intent = new Intent(MainActivity.this,
                            RadioPlayer.class);
                    intent.putExtra(RadioPlayer.START_PLAY, true);

                    startService(intent);
                    Player.setImageResource(R.drawable.stop);
                    State = "PLAY";
                }
                else{
                    Intent intent = new Intent(MainActivity.this,
                            RadioPlayer.class);
                    stopService(intent);
                    Player.setImageResource(R.drawable.start);

                    State = "STOP";
                }
            }

        });

        Schedule.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent scheduleListing = new Intent(MainActivity.this,
                        Schedule.class);
                startActivity(scheduleListing);
            }
        });

        Presenters.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent PresenterList = new Intent(MainActivity.this,
                        Presenters.class);
                startActivity(PresenterList);
            }
        });

        Image.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent ImgGet = new Intent(MainActivity.this,
                        OnAir.class);
                startActivity(ImgGet);


            }
        }); 

    }// End On Create


    BroadcastReceiver LoadingReceiver = new BroadcastReceiver(){

        @SuppressLint("NewApi")
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            progress = new ProgressDialog(MainActivity.this);
            progress.setTitle("Loading");
            progress.setMessage("Loading RadioPlymouth...");
            progress.show(); //error here
            Player.setImageResource(R.drawable.stop);
        }
    };

    BroadcastReceiver CompletionReceiver = new BroadcastReceiver(){

        @Override
        public void onReceive(Context context, Intent intent) {
            progress.dismiss();
            Player.setImageResource(R.drawable.stop);

        }

    };

    BroadcastReceiver ErrorReceiver = new BroadcastReceiver(){

        @Override
        public void onReceive(Context context, Intent intent) {
            progress.dismiss();
            State = "STOP";
            Player.setImageResource(R.drawable.start);

        }

    };


}


06-28 14:33:14.988: E/AndroidRuntime(18960): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@41888998 is not valid; is your activity running?
06-28 14:33:14.988: E/AndroidRuntime(18960):    at android.view.ViewRootImpl.setView(ViewRootImpl.java:564)
06-28 14:33:14.988: E/AndroidRuntime(18960):    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:269)
06-28 14:33:14.988: E/AndroidRuntime(18960):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
06-28 14:33:14.988: E/AndroidRuntime(18960):    at android.app.Dialog.show(Dialog.java:289)
06-28 14:33:14.988: E/AndroidRuntime(18960):    at com.radioplymouth.RadioPlymouth.MainActivity$1.onReceive(MainActivity.java:144)

当我更改 Activity 时发生错误(示例),从 MainActivity -> 转到计划页面 -> 返回到 MainActivity。之前有人建议我需要在 onPause() 和/或 onResume() 中处理窗口 token ,但是我尝试这样做并没有成功。在不改变 Activity 的情况下,代码运行良好。如果有人能发现我遗漏的东西,那就太好了:)

最佳答案

经过大量搜索、调试和摸不着头脑,我终于找到了解决方案。

if(!isFinishing()){
                progress.show();            
                Player.setImageResource(R.drawable.stop);
            }

我用 else 和 toast 来查看条件何时为真,看起来好像正在调用封装此代码的 onReceive()多次直到条件不成立。我不完全确定这意味着什么,或者为什么会发生,但它确实有效。

关于Android:ProgressDialog.show() WindowManager token ,无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24467391/

相关文章:

android - 这里 SDK Android 在布局更改时调整大小

android - 在 App Inventor 2 中使用 ResultNotifier.Show Progress Dialog 的正确方法?

java - 线程完成后出现 ProgressDialog

android - 无法删除 windowManager.addView() 附加的 View

android - 使用 Google Play 上传 key 签署 APK

java - 如何覆盖内部使用类的方法?

java - Android 2.3 使用 Fragment 时保持 ListView 位置

java - android中进度对话的时间限制

android - android 中 getRealMetrics 获取屏幕原始尺寸的替代方法是什么

唤醒屏幕时不显示 Android Activity 且锁定屏幕不禁用