望塵軒中一盞茶

          統(tǒng)計

          留言簿

          友情鏈接

          閱讀排行榜

          評論排行榜

          進度框按back鍵返回上一個activity(處理Leak Window)

          場景描述:進入一個界面需要先去網(wǎng)絡(luò)加載內(nèi)容,浮出一個進度框提示正在加載中,這時如果按下back鍵返回,本意是返回上一個界面,而系統(tǒng)默認(rèn)只是dismiss掉了進度框,需要再按一次back鍵才能返回上一個界面?,F(xiàn)在想只按一次back鍵就返回上一個界面,催生了本次實驗。具體實現(xiàn)參考代碼:

          首先繼承ProgressDialog類,實現(xiàn)自己的進度框類,這里主要是為了在進度框處于焦點時,捕獲其按鍵事件。具體代碼如下:

          public class MyDialog extends ProgressDialog {
              private Activity parentActivity;
              public MyDialog(Context context) {
          	super(context);
          	parentActivity = (Activity) context;
              }
              @Override
              public boolean onKeyDown(int keyCode, KeyEvent event) {
          	if(parentActivity != null) {
                      return parentActivity.onKeyDown(keyCode, event);
          	}
          	return super.onKeyDown(keyCode, event);
              }
          }

          這里在進度框處于焦點狀態(tài)按下back鍵時,調(diào)用了打開進度框的activity的按鍵監(jiān)聽事件,將相關(guān)處理交給activity進行處理。Activity的實現(xiàn)代碼如下:

          public class DialogTestActivity extends Activity {
          
          	private MyDialog pDialog;
          
              @Override
              public void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.main);
                  showLoadingDialog();
              }
          
              private void showLoadingDialog() {
              	pDialog = new MyDialog(this);
              	pDialog.setMessage("正在加載中...");
          		pDialog.setCancelable(true);
          		pDialog.show();
          	}
          
          	private void dismissLoadingDialog() {
          		if(pDialog != null && pDialog.isShowing()) {
          			pDialog.dismiss();
          		}
          	}
          
          	@Override
          	public boolean onKeyDown(int keyCode, KeyEvent event) {
          		finish();
          		return super.onKeyDown(keyCode, event);
          	}
          
          	@Override
          	protected void onDestroy() {
          		dismissLoadingDialog();
          		super.onDestroy();
          	}
          }

          這里在onKeyDown實現(xiàn)里直接調(diào)用了Activity的finish()方法來結(jié)束Activity,如果不調(diào)用此方法就不能實現(xiàn)想要的效果;并在onDestroy()方法里調(diào)用了關(guān)掉進度框的操作,這里是非常必要的。雖然不調(diào)用程序一樣會正常返回,但是在logcat中會看到這里有問題,具體信息如下:

          12-20 15:24:51.315: E/WindowManager(6759): Activity com.jade.dialog.DialogTestActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44f493c8 that was originally added here
          12-20 15:24:51.315: E/WindowManager(6759): android.view.WindowLeaked: Activity com.jade.dialog.DialogTestActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44f493c8 that was originally added here
          12-20 15:24:51.315: E/WindowManager(6759): 	at android.view.ViewRoot.(ViewRoot.java:247)
          12-20 15:24:51.315: E/WindowManager(6759): 	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
          12-20 15:24:51.315: E/WindowManager(6759): 	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
          12-20 15:24:51.315: E/WindowManager(6759): 	at android.view.Window$LocalWindowManager.addView(Window.java:424)
          12-20 15:24:51.315: E/WindowManager(6759): 	at android.app.Dialog.show(Dialog.java:241)
          12-20 15:24:51.315: E/WindowManager(6759): 	at com.jade.dialog.DialogTestActivity.showLoadingDialog(DialogTestActivity.java:23)
          12-20 15:24:51.315: E/WindowManager(6759): 	at com.jade.dialog.DialogTestActivity.onCreate(DialogTestActivity.java:15)
          12-20 15:24:51.315: E/WindowManager(6759): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
          12-20 15:24:51.315: E/WindowManager(6759): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
          12-20 15:24:51.315: E/WindowManager(6759): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
          12-20 15:24:51.315: E/WindowManager(6759): 	at android.app.ActivityThread.access$2300(ActivityThread.java:125)
          12-20 15:24:51.315: E/WindowManager(6759): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
          12-20 15:24:51.315: E/WindowManager(6759): 	at android.os.Handler.dispatchMessage(Handler.java:99)
          12-20 15:24:51.315: E/WindowManager(6759): 	at android.os.Looper.loop(Looper.java:123)
          12-20 15:24:51.315: E/WindowManager(6759): 	at android.app.ActivityThread.main(ActivityThread.java:4627)
          12-20 15:24:51.315: E/WindowManager(6759): 	at java.lang.reflect.Method.invokeNative(Native Method)
          12-20 15:24:51.315: E/WindowManager(6759): 	at java.lang.reflect.Method.invoke(Method.java:521)
          12-20 15:24:51.315: E/WindowManager(6759): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
          12-20 15:24:51.315: E/WindowManager(6759): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
          12-20 15:24:51.315: E/WindowManager(6759): 	at dalvik.system.NativeStart.main(Native Method)

          出現(xiàn)上述問題的原因是在Activity調(diào)用finish()方法結(jié)束自己的時候,進度框尚未關(guān)閉。當(dāng)然也有另外一種方案,就是修改MyDialog中按鍵處理部分,首先dismiss()自己,然后再調(diào)用activity的按鍵事件處理方法。具體代碼如下:

          public boolean onKeyDown(int keyCode, KeyEvent event) {
          	if(parentActivity != null) {
          		dismiss(); //在這里自己關(guān)掉自己嘍~
          		return parentActivity.onKeyDown(keyCode, event);
          	}
          	return super.onKeyDown(keyCode, event);
          }

          版權(quán)聲明

          文章編輯:玉盞掬清茶 ( 點擊名字查看他發(fā)布的更多文章 )
          原始站點:玉盞掬清茶(www.58bxj.com)
          原文標(biāo)題:進度框按back鍵返回上一個activity(處理Leak Window)
          原文鏈接:http://www.58bxj.com/art/299.html

          標(biāo)簽: 

          posted on 2011-12-20 15:38 wzhongyu 閱讀(1969) 評論(0)  編輯  收藏 所屬分類: Java學(xué)習(xí)

          我的便捷門:綜合頻道 數(shù)碼頻道 商城頻道 電器頻道 男人頻道 女人頻道 居家玩具 美容頻道 飾品鞋包 食品頻道 臺灣館頻道
          主站蜘蛛池模板: 黄梅县| 太白县| 福海县| 无为县| 贵德县| 教育| 浦县| 景洪市| 清苑县| 朝阳区| 沙湾县| 大兴区| 四平市| 磐石市| 都兰县| 尼玛县| 巴青县| 察哈| 常宁市| 玉山县| 通道| 柳江县| 乐亭县| 黄陵县| 临海市| 深水埗区| 大新县| 虹口区| 西林县| 南汇区| 安西县| 新蔡县| 达孜县| 江都市| 通江县| 晴隆县| 新闻| 迁安市| 久治县| 抚宁县| 海淀区|