这个错误是由于:
public void show() {
loadingDialog.show();
}
这个之前是上面这样写的.这样写,就会导致,我调用这个dialog,去显示的时候,这个dialog依赖的
activity可能已经销毁了,这个时候,由于异步的原因,调用到这里, 所以肯定会出错的,因为,这个
activity已经没有了,你还想在这个activity上面去显示一个dialog.
public void show() {
if(getActivityByContext(loadingDialog.getContext())!=null &&
!getActivityByContext(loadingDialog.getContext()).isFinishing()){
loadingDialog.show();
};
}
public void setTitle(String msg) {
tipTextView.setText(msg);
}
public static Activity getActivityByContext(Context context) {
while (context instanceof ContextWrapper) {
if (context instanceof Activity) {
return (Activity) context;
}
context = ((ContextWrapper) context).getBaseContext();
}
return null;
}
上面这个是修改完的,可以看到这里,通过传入的context,来获取到,这context对应的activity,
获取了以后,然后,判断这个activity,是不是正在关闭,或者已经关闭了,不存在了,已经关闭了就是null,
然后没有关闭的话,就用isFinishing进行判断了一下对吧.如果正在关闭,或者已经关闭了,就不要
再弹框了,如果弹会报错的.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
然后我把:这个WaitDialog的源码贴出来,为了看的方便:
package com.baidu.idl.main.facesdk.utils;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.ContextWrapper;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.baidu.idl.main.facesdk.gatelibrary.R;
public class WaitDialog {
Dialog loadingDialog = null;
String msg = "";
Context context = null;
TextView tipTextView;
private WaitDialog(Context context, String msg) {
this.context = context;
this.msg = msg;
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.dialog_loading, null);// 得到加载view
LinearLayout layout = (LinearLayout) v
.findViewById(R.id.dialog_loading_view);// 加载布局
tipTextView = (TextView) v.findViewById(R.id.tipTextView);// 提示文字
tipTextView.setText(msg);// 设置加载信息
loadingDialog = new Dialog(context, R.style.MyDialogStyle);// 创建自定义样式dialog
loadingDialog.setCancelable(true); // 是否可以按“返回键”消失
loadingDialog.setCanceledOnTouchOutside(false); // 点击加载框以外的区域
loadingDialog.setContentView(layout, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));// 设置布局
loadingDialog.getLayoutInflater();
/**
* 将显示Dialog的方法封装在这里面
*/
Window window = loadingDialog.getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setGravity(Gravity.CENTER);
window.setAttributes(lp);
window.setWindowAnimations(R.style.PopWindowAnimStyle);
}
public static WaitDialog getInstance(Context context, String msg) {
return new WaitDialog(context, msg);
}
public void show() {
// if (!loadingDialog.getContext()())//xActivity即为本界面的Activity
// {
////dialog.show
// }
if(getActivityByContext(loadingDialog.getContext())!=null &&
!getActivityByContext(loadingDialog.getContext()).isFinishing()){
loadingDialog.show();
};
}
public void setTitle(String msg) {
tipTextView.setText(msg);
}
public static Activity getActivityByContext(Context context) {
while (context instanceof ContextWrapper) {
if (context instanceof Activity) {
return (Activity) context;
}
context = ((ContextWrapper) context).getBaseContext();
}
return null;
}
/**
* 关闭dialog
*/
public void closeDialog() {
try {
if (loadingDialog != null && loadingDialog.isShowing()) {
loadingDialog.dismiss();
}
} catch (Exception e) {
} finally {
loadingDialog = null;
}
}
}
然后下面,封装一下WaitDialog :
private WaitDialog waitDialog;
public void showDialog(Context context, String msg) {
if (waitDialog != null) {
waitDialog.closeDialog();
}
waitDialog = WaitDialog.getInstance(context, msg);
waitDialog.show();
dialogState = 2; //开着是2
}
public void closeDialog() {
if (waitDialog != null) {
waitDialog.closeDialog();
dialogState = 1; //关闭是1
}
}
然后使用的时候:
BaseApplication.context().showDialog(FaceBodyCheckActivity.this, "正在连接设备...");
可以看到这里,我把上面的showDialog方法,写到了BASEApplication中了,使用的时候,就按照
上面这样使用就可以了:
BaseApplication.context().closeDialog();
然后:
BaseApplication 这类的代码我也贴出来吧.方便看:
package com.baidu.idl.main.facesdk.activity;
import android.annotation.TargetApi;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import com.baidu.idl.main.facesdk.utils.DeviceFinal;
import com.baidu.idl.main.facesdk.utils.WaitDialog;
import com.qn.device.listener.QNResultCallback;
import com.qn.device.out.QNBleApi;
public class BaseApplication extends Application {
static Context _context;
private static String PREF_NAME = "ydy_store";
private String token;
public Integer dialogState = 0;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
/**
* Context base application.
*
* @return the base application
*/
public static synchronized BaseApplication context() {
return (BaseApplication) _context;
}
/**
* Gets preferences.
*
* @return the preferences
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static SharedPreferences getPreferences() {
return context().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
}
/**
* On create.
*/
@Override
public void onCreate() {
super.onCreate();
QNBleApi mQNBleApi = QNBleApi.getInstance(this);
String encryptPath = "file:///android_asset/123456789.qn";
mQNBleApi.initSdk(DeviceFinal.QN_APPID, encryptPath, new QNResultCallback() {
@Override
public void onResult(int code, String msg) {
System.out.println("初始化" + code + ":" + msg);
}
});
_context = getApplicationContext();
// ToastApp.initToastUtils(_context);
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(_context);
//初始化Context
// ContextHelper.getInstance().init(this);
}
private WaitDialog waitDialog;
public void showDialog(Context context, String msg) {
if (waitDialog != null) {
waitDialog.closeDialog();
}
waitDialog = WaitDialog.getInstance(context, msg);
waitDialog.show();
dialogState = 2; //开着是2
}
public void closeDialog() {
if (waitDialog != null) {
waitDialog.closeDialog();
dialogState = 1; //关闭是1
}
}
}
?
本文暂时没有评论,来添加一个吧(●'◡'●)