Android &引用;WindowManager BadTokenException无法添加窗口;为什么我在使用谷歌地图时会遇到这个异常?
我正在使用谷歌地图显示(pin)不同的位置。点击后退按钮显示不同的位置后,它会重定向到我的主屏幕。大约10-15秒后,我的应用程序关闭。我相信位置更新仍在后台运行,这会导致此错误。如何停止在后台更新活动Android &引用;WindowManager BadTokenException无法添加窗口;为什么我在使用谷歌地图时会遇到这个异常?,android,google-maps,exception,android-asynctask,Android,Google Maps,Exception,Android Asynctask,我正在使用谷歌地图显示(pin)不同的位置。点击后退按钮显示不同的位置后,它会重定向到我的主屏幕。大约10-15秒后,我的应用程序关闭。我相信位置更新仍在后台运行,这会导致此错误。如何停止在后台更新活动 package com.bar.start; import java.util.ArrayList; import org.apache.http.HttpEntity; import org.apache.http.conn.ClientConnectionM
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)
package 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.BitmapDescriptorFactory;
导入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.SharedReferences;
导入android.location.location;
导入android.location.LocationListener;
导入android.location.LocationManager;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.print.printtributes;
导入android.util.Log;
导入android.widget.ArrayAdapter;
公共类LocationActivity扩展活动实现LocationListener{
私有最终字符串标记=getClass().getSimpleName();
受保护的连接检测器连接检测器;
公共布尔值是互联存在的;
私人字符串[]个位置;
公共静态Loc[]getloc;
私人场所经理场所经理;
私人位置loc;
静态HttpEntity entityResponse=null;
谷歌地图;
标记选项mp;
活动;
语境;
位置监听器;
双lat,lon;
最后一个字符串Googlekey=“APikey”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
SharedReferences SharedReferences;
int locationCount=0;
connectionDetector=新的connectionDetector(getApplicationContext());
isInternetPresent=connectionDetector.IsConnectionToInternet();
super.onCreate(savedInstanceState);
setContentView(R.layout.location);
LocationManager lm=(LocationManager)getSystemService(Context.LOCATION\u服务);
lm.RequestLocationUpdate(LocationManager.NETWORK_提供程序,1000,0,此);
map=((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
}
@凌驾
已更改位置上的公共无效(位置){
map.clear();
lat=位置。getLatitude();
lon=location.getLongitude();
Googleapicall exeTask=新的Googleapicall();
exeTask.execute();
mp=新标记选项();
mp.位置(新车床(车床、车床);
map.addMarker(mp);
议员头衔(“我的位置”);
p、 animateCamera(CameraUpdateFactory.newLatLngZoom(
新板条(lat,lon),13);
}
@凌驾
公共无效onProviderDisabled(字符串提供程序){
}
@凌驾
公共无效onProviderEnabled(字符串提供程序){
}
@凌驾
public void onStatusChanged(字符串提供程序、int状态、Bundle extra){
}
公共类GooglePicall扩展异步任务
{
Loc statStr=null;
Loc[]结果=null;
ArrayList SIArrayList=新的ArrayList();
私人对话;
@凌驾
受保护的void onPreExecute(){
Dialog=新建进度对话框(LocationActivity.this);
Dialog.setMessage(LocationActivity.this.getResources().getString(
R.字符串加载);
对话框。可设置可取消(false);
Dialog.show();
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串结果=”;
尝试
{
如果(isInternetPresent)
{
getloc=Webcall.getdet(lat、lon、Googlekey);
结果=“成功”;
系统输出打印项次(“getloc”+getloc.length);
}
其他的
{
结果=“失败”;
}
}
捕获(例外e)
{
结果=“失败”;
e、 printStackTrace();
}
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串结果){
Loc lc=新Loc();
试一试{
if(result.contains(“Success”))
{
mp=新标记选项();
对于(int i=0;i全局声明此值
int i=0;
在上面的代码中进行以下更改。这样它将只更新一次。(windowmanager badtokenexception无法添加窗口)此异常不会再次发生。但我不知道这是否是正确的方法。如果有人得到更好的答案,欢迎您
@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();
}
}
@覆盖
已更改位置上的公共无效(位置){
对于(;i你可以试试
创建布尔静态变量
private static boolean isActivityOpen = false ;
更新onCreate()处的值
检查对话框显示/关闭方法时的值
if(isActivityOpen )
{
Dialog.show();
}
禁用onDestroy()中的值
取消()显示地图时的计时器任务activity@pskink我尝试了finish(),但什么也没发生。当我在eclipse中按ctrl+space时,.cancel()没有出现。请参阅:@pskink,但这里没有时间
if(isActivityOpen )
{
Dialog.show();
}
isActivityOpen = false;