多种情况
1、在子线程中打开,应放到主线程中
2、参数为getApplicationContext(),应为activity
3、activity未加载出来就去显示,可以延迟显示:new Handler().postDelayed
4、popup显示写在回调中,如果activity被销毁,回调成功后显示pop,会报这个错误。应判断显示popup的activity是否被销毁
做测试
(模仿网络耗时操作)
public class MNetUtil {
private NetSuccess success;
public MNetUtil(NetSuccess success) {
this.success = success;
}
private Handler mHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
if (success != null) {
success.netSuccess();
}
};
};
public void startNet(){
new Thread(){
public void run() {
for (int i = 0; i < 5; i++) {
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
mHandler.sendEmptyMessage(0);
};
}.start();
}
public interface NetSuccess{
public void netSuccess();
}
}
BActivity(随便写一个)
public class BActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
}
}
MainActivity(布局为两个按钮,进来后调用耗时操作,完成耗时操作后执行回调,回调中显示popupwindow)
public class MainActivity extends Activity implements NetSuccess, OnClickListener{
private Button bt_go,bt_show;
private PopupWindow mPop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setData();
setListeners();
}
private void setListeners() {
bt_go.setOnClickListener(this);
bt_show.setOnClickListener(this);
}
private void setData() {
MNetUtil netUtil = new MNetUtil(this);
netUtil.startNet();
}
private void initView() {
bt_go = (Button) findViewById(R.id.bt_go);
bt_show = (Button) findViewById(R.id.bt_show);
}
@Override
public void netSuccess() {
sowPop();
}
private void sowPop() {
if (mPop == null) {
mPop = new PopupWindow();
final TextView view = new TextView(this);
view.setText("aaaaaaaaaaaaaaaaaaaaaaaaaaa");
mPop.setContentView(view);
mPop.setWidth(ScreenUtil.getScreenWidth(this));
mPop.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
mPop.setFocusable(true);
mPop.setBackgroundDrawable(new BitmapDrawable());
mPop.setInputMethodMode(PopupWindow.INPUT_METHOD_FROM_FOCUSABLE);
mPop.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
}
if (!mPop.isShowing()) {
mPop.showAsDropDown(bt_show);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_go:
Intent intent = new Intent(MainActivity.this, BActivity.class);
startActivity(intent);
finish();
break;
case R.id.bt_show:
sowPop();
break;
}
}
}
进来之后先点击go按钮,调到Bactivity中,等待5秒,回调执行后程序奔溃
然后我们在在显示potwindow的代码前判断
if(isFinishing()){
//这儿显示popwindow
}
然后不报错了