"窗口管理BadTokenException,无法添加窗口"为什么我收到此异常,而使用谷歌地图? [英] "WindowManager BadTokenException-Unable to add window"Why i am getting this exception while using google maps?

查看:194
本文介绍了"窗口管理BadTokenException,无法添加窗口"为什么我收到此异常,而使用谷歌地图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用谷歌地图显示(针)不同places.After显示不同palces击中背部按钮将其重定向到我家screen.Around 10-15秒后,我的应用程序获取closed.I认为,位置更新时在导致本error.How停止更新在背景活性的背景仍在运行

 包com.bar.start;    进口的java.util.ArrayList;
    进口org.apache.http.HttpEntity;
    进口org.apache.http.conn.ClientConnectionManager;
    进口org.apache.http.impl.client.DefaultHttpClient;
    进口org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
    进口org.apache.http.params.HttpParams;
    进口com.bar.barapp.R;
    进口com.bar.location.Loc;
    进口com.bar.location.Webcall;
    进口com.google.android.gms.maps.CameraUpdateFactory;
    进口com.google.android.gms.maps.GoogleMap;
    进口com.google.android.gms.maps.MapFragment;
    进口com.google.android.gms.maps.model.BitmapDesc​​riptorFactory;
    进口com.google.android.gms.maps.model.Circle;
    进口com.google.android.gms.maps.model.LatLng;
    进口com.google.android.gms.maps.model.MarkerOptions;
    进口android.app.Activity;
    进口android.app.ProgressDialog;
    进口android.content.Context;
    进口android.content.Shared preferences;
    进口android.location.Location;
    进口android.location.LocationListener;
    进口android.location.LocationManager;
    进口android.os.AsyncTask;
    进口android.os.Bundle;
    进口android.print.PrintAttributes;
    进口android.util.Log;
    进口android.widget.ArrayAdapter;    公共类LocationActivity扩展活动实现LocationListener的{     私人最终字符串标记=的getClass()getSimpleName()。
     保护ConnectionDetector connectionDetector;
     公共布尔isInternet present;
     私有String []的地方;
     公共静态禄[] getloc;
     私人的LocationManager的LocationManager;
     私人位置禄;     静态HttpEntity entityResponse = NULL;
     GoogleMap的地图;
     熔点的MarkerOptions;
     活动活动;
     上下文语境;
     LocationListener的侦听器;
     双纬度,经度;
    最后弦乐Googlekey =APikey;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){        共享preferences共享preferences;
        INT locationCount = 0;
        connectionDetector =新ConnectionDetector(getApplicationContext());
        isInternet present = connectionDetector.isConnectingToInternet();
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.location);     LM的LocationManager =(的LocationManager)getSystemService(Context.LOCATION_SERVICE);      lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1000,0,这一点);      地图=((MapFragment)getFragmentManager()findFragmentById(R.id.map)。)的GetMap();    }    @覆盖
    公共无效onLocationChanged(地点){        map.clear();
        纬度= location.getLatitude();
        经度= location.getLongitude();        Googleapicall exeTask =新Googleapicall();
          exeTask.execute();          MP =新的MarkerOptions();           mp.position(新经纬度(纬度,经度));
           map.addMarker(MP);
           mp.title(我的位置);
   p.animateCamera(CameraUpdateFactory.newLatLngZoom(
          新的经纬度(纬度,经度),13));    }    @覆盖
    公共无效onProviderDisabled(字符串提供商){
    }    @覆盖
    公共无效onProviderEnabled(字符串提供商){    }    @覆盖
    公共无效onStatusChanged(字符串提供商,INT地位,捆绑演员){    }    公共类Googleapicall扩展的AsyncTask<弦乐,太虚,字符串>    {
        禄statStr = NULL;
         禄[] statInfoResult = NULL;
         ArrayList的<&禄GT; SIArrayList =新的ArrayList<&禄GT;();        私人ProgressDialog对话框;        @覆盖
        在preExecute保护无效(){
            对话=新ProgressDialog(LocationActivity.this);
            Dialog.setMessage(LocationActivity.this.getResources()的getString(
                    R.string.loading));
            Dialog.setCancelable(假);
            Dialog.show();        }        @覆盖
        保护字符串doInBackground(字符串... PARAMS){            字符串结果=;
            尝试
            {                如果(isInternet present)                {
                getloc = Webcall.getdet(纬度,经度,Googlekey);
                结果=成功;
                的System.out.println(getloc+ getloc.length);                }
                其他
                {
                    结果=失败;
                }
            }
            赶上(例外五)
            {
                结果=失败;
                e.printStackTrace();
            }            返回结果;
        }        @覆盖
        保护无效onPostExecute(字符串结果){
            禄LC =新禄();            尝试{                如果(result.contains(成功))
                {                    MP =新的MarkerOptions();                    的for(int i = 0; I< getloc.length;我++)
                    {
                        双拉提= getloc [I] .latitudes;
                        双隆基= getloc [I] .longitudes;
                           map.addMarker(新的MarkerOptions()
                              .title伪(Nearbyplace)
                              。位置(
                                新的经纬度(LATI,隆基))
                              .icon(BitmapDesc​​riptorFactory.fromResource(R.drawable.small)));
                    }
                }                }
            抓住
            (例外五)
            {
                e.printStackTrace();            }            Dialog.dismiss();        }    }
}
11月4日至6日:09:53.768:E / AndroidRuntime(5188):致命异常:主要
11月4日至6日:09:53.768:E / AndroidRuntime(5188):android.view.WindowManager $ BadTokenException:无法添加窗口 - 令牌android.os.BinderProxy@42ea1380无效;是您的活动运行?
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在android.view.ViewRootImpl.setView(ViewRootImpl.java:796)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:288)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:73)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在android.app.Dialog.show(Dialog.java:287)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在com.bar.start.LocationActivity $ Googleapicall.on preExecute(LocationActivity.java:194)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在android.os.AsyncTask.execute(AsyncTask.java:534)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在com.bar.start.LocationActivity.onLocationChanged(LocationActivity.java:104)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在android.location.LocationManager $ ListenerTransport._handleMessage(LocationManager.java:255)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在android.location.LocationManager $ ListenerTransport.access $ 000(LocationManager.java:184)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在android.location.LocationManager $ ListenerTransport $ 1.handleMessage(LocationManager.java:200)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在android.os.Handler.dispatchMessage(Handler.java:99)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在android.os.Looper.loop(Looper.java:137)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在android.app.ActivityThread.main(ActivityThread.java:5419)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在java.lang.reflect.Method.invokeNative(本机方法)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在java.lang.reflect.Method.invoke(Method.java:525)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1209)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
11月4日至6日:09:53.768:E / AndroidRuntime(5188):在dalvik.system.NativeStart.main(本机方法)


解决方案

在全球范围内宣布此值。

  INT I = 0;

在上面的code进行以下changes.So,它会更新一次。(窗口管理badtokenexception,无法添加窗口)这个异常不会发生again.But我不知道它是否是做正确的方法。如果任何人有更好的答案,欢迎你。

  @覆盖
        公共无效onLocationChanged(地点){
               对于(; I< = 0;我+ +)
               {                   map.clear();                    纬度= location.getLatitude();
                    经度= location.getLongitude();                      MP =新的MarkerOptions();                       mp.position(新经纬度(纬度,经度));
                       map.addMarker(MP);
                       mp.title(我的位置);                   map.animateCamera(CameraUpdateFactory.newLatLngZoom(
                              新的经纬度(纬度,经度),13));                            Googleapicall exeTask =新Googleapicall();
                              exeTask.execute();               }
        }

I am using google map to show(pin) different places.After showing different palces when hit the back button it redirects to my home screen.Around 10-15 seconds later my application gets closed.I believe that the location updates is still running in the background which causes this error.How to stop updating the activity in the background?

    package com.bar.start;

    import java.util.ArrayList;
    import org.apache.http.HttpEntity;
    import org.apache.http.conn.ClientConnectionManager;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
    import org.apache.http.params.HttpParams;
    import com.bar.barapp.R;
    import com.bar.location.Loc;
    import com.bar.location.Webcall;
    import com.google.android.gms.maps.CameraUpdateFactory;
    import com.google.android.gms.maps.GoogleMap;
    import com.google.android.gms.maps.MapFragment;
    import com.google.android.gms.maps.model.BitmapDescriptorFactory;
    import com.google.android.gms.maps.model.Circle;
    import com.google.android.gms.maps.model.LatLng;
    import com.google.android.gms.maps.model.MarkerOptions;
    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.print.PrintAttributes;
    import android.util.Log;
    import android.widget.ArrayAdapter;

    public class LocationActivity extends Activity implements LocationListener {

     private final String TAG = getClass().getSimpleName();
     protected ConnectionDetector connectionDetector;
     public Boolean isInternetPresent;
     private String[] places;
     public static Loc [] getloc;
     private LocationManager locationManager;
     private Location loc;

     static HttpEntity entityResponse = null;
     GoogleMap map;
     MarkerOptions mp;
     Activity activity;
     Context context;
     LocationListener listener;
     Double lat,lon;
    final   String Googlekey="APikey" ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {



        SharedPreferences sharedPreferences;
        int locationCount = 0;
        connectionDetector = new ConnectionDetector(getApplicationContext());
        isInternetPresent = connectionDetector.isConnectingToInternet();
    super.onCreate(savedInstanceState);
    setContentView(R.layout.location);

     LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

      lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, this);

      map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

    }

    @Override
    public void onLocationChanged(Location location) {

        map.clear();
        lat=location.getLatitude();
        lon=location.getLongitude();

        Googleapicall exeTask = new Googleapicall();
          exeTask.execute();

          mp = new MarkerOptions();

           mp.position(new LatLng(lat, lon));
           map.addMarker(mp);
           mp.title("My Location");
   p.animateCamera(CameraUpdateFactory.newLatLngZoom(
          new LatLng(lat, lon), 13));

    }

    @Override
    public void onProviderDisabled(String provider) {


    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }



    public class Googleapicall extends AsyncTask<String, Void, String>

    {


        Loc statStr = null;
         Loc[] statInfoResult = null;
         ArrayList<Loc> SIArrayList = new ArrayList<Loc>();

        private ProgressDialog Dialog;

        @Override
        protected void onPreExecute() {
            Dialog = new ProgressDialog(LocationActivity.this);
            Dialog.setMessage(LocationActivity.this.getResources().getString(
                    R.string.loading));
            Dialog.setCancelable(false);
            Dialog.show();

        }

        @Override
        protected String doInBackground(String... params) {

            String result = "";
            try 
            {

                if(isInternetPresent)

                {
                getloc=Webcall.getdet(lat,lon,Googlekey);
                result = "Success";
                System.out.println("getloc "+getloc.length);

                }


                else 
                {
                    result = "Failure";
                }
            } 


            catch (Exception e)
            {
                result = "Failure";
                e.printStackTrace();
            }

            return result;


        }

        @Override
        protected void onPostExecute(String result) {


            Loc lc=new Loc();

            try {

                if(result.contains("Success"))
                {

                    mp=new MarkerOptions();

                    for(int i=0;i<getloc.length;i++)
                    {
                        Double lati=getloc[i].latitudes;
                        Double longi=getloc[i].longitudes;
                           map.addMarker(new MarkerOptions()
                              .title("Nearbyplace")
                              .position(
                                new LatLng(lati,longi))
                              .icon(BitmapDescriptorFactory.fromResource(R.drawable.small)));
                    }
                }

                } 
            catch 
            (Exception e) 
            {
                e.printStackTrace();    

            }

            Dialog.dismiss();

        }

    }


}


04-06 11:09:53.768: E/AndroidRuntime(5188):     FATAL EXCEPTION: main
04-06 11:09:53.768: E/AndroidRuntime(5188):     android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@42ea1380 is not valid; is your activity running?
04-06 11:09:53.768: E/AndroidRuntime(5188):     at android.view.ViewRootImpl.setView(ViewRootImpl.java:796)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:288)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:73)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at android.app.Dialog.show(Dialog.java:287)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at com.bar.start.LocationActivity$Googleapicall.onPreExecute(LocationActivity.java:194)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at android.os.AsyncTask.execute(AsyncTask.java:534)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at com.bar.start.LocationActivity.onLocationChanged(LocationActivity.java:104)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:255)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:184)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:200)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at android.os.Looper.loop(Looper.java:137)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at android.app.ActivityThread.main(ActivityThread.java:5419)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at java.lang.reflect.Method.invokeNative(Native Method)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at java.lang.reflect.Method.invoke(Method.java:525)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
04-06 11:09:53.768: E/AndroidRuntime(5188):     at dalvik.system.NativeStart.main(Native Method)

解决方案

Globally declare this value.

int i=0;

In the above code make the following changes.So that it will update only once.(windowmanager badtokenexception-unable to add window)this exception will not happen again.But i dont know whether it is right method to do.If anyone got better answer,you are welcome.

@Override
        public void onLocationChanged(Location location) {


               for(;i<=0;i++)
               {

                   map.clear();

                    lat=location.getLatitude();
                    lon=location.getLongitude();

                      mp = new MarkerOptions();

                       mp.position(new LatLng(lat, lon));
                       map.addMarker(mp);
                       mp.title("My Location");

                   map.animateCamera(CameraUpdateFactory.newLatLngZoom(
                              new LatLng(lat, lon), 13));

                            Googleapicall exeTask = new Googleapicall();
                              exeTask.execute();

               }


        }

这篇关于&QUOT;窗口管理BadTokenException,无法添加窗口&QUOT;为什么我收到此异常,而使用谷歌地图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆