当前位置:  编程技术>移动开发
本页文章导读:
    ▪Handler的应用        Handler的使用 提个小问题,就是如何让程序5秒钟更新一下Title.首先我们看一下习惯了Java编程的人,在不知道Handler的用法之前是怎么样写的程序,代码如下所示 package cn.caiwb.handler; imp.........
    ▪ Ubuntu 得到默认面板        Ubuntu 失去默认面板 按下 Alt+F2,输入以下内容并按回车gconftool --recursive-unset /apps/panel再次按下 Alt+F2,输入以下内容并按回车rm -rf ~/.gconf/apps/panel最后再次按下 Alt+F2,接着再输入以下内容并.........
    ▪ [转]内存储器管理 - 内存使用不当小结       [转]内存管理 --- 内存使用不当小结     因为我们的应用程序能够使用的内存有限,所以在编写代码的时候需要特别注意内存 使用问题。如下是一些常见的内存使用不当的情况。   ⑴查询.........

[1]Handler的应用
    来源: 互联网  发布时间: 2014-02-18
Handler的使用
提个小问题,就是如何让程序5秒钟更新一下Title.

首先我们看一下习惯了Java编程的人,在不知道Handler的用法之前是怎么样写的程序,代码如下所示

    package cn.caiwb.handler;  
    import java.util.Timer;  
    import java.util.TimerTask;  
    import android.app.Activity;  
    import android.os.Bundle;  
    public class HandlerDemo extends Activity {  
          
        //title为setTitle方法提供变量,这里为了方便我设置成了int型  
        private int title = 0;  
          
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
              
            Timer timer = new Timer();  
            timer.scheduleAtFixedRate(new MyTask(), 1, 5000);  
        }  
              
        private class MyTask extends TimerTask{  
            @Override  
            public void run() {  
                  
                setTitle("hi~  " + title);  
                title ++;  
            }     
        }  
    }  



然而当我们执行程序,并不能达到我们预期的效果,所以Android 引进了Handler 这个特殊的类,可以说它是Runnable和Activity交互的桥梁

,所以我们只要在run方法中发送Message,而在Handler里,通过不同的Message执行不同的任务。


所以我们修改后的代码如下:


    package cn.caiwb.handler;  
    import java.util.Timer;  
    import java.util.TimerTask;  
    import android.app.Activity;  
    import android.os.Bundle;  
    import android.os.Handler;  
    import android.os.Message;  
    public class HandlerDemo extends Activity {  
          
        //title为setTitle方法提供变量,这里为了方便我设置成了int型  
        private int title = 0;  
          
        private Handler mHandler = new Handler(){  
              
            public void handleMessage(Message msg) {  
                switch (msg.what) {  
                case 1:  
                    updateTitle();  
                    break;  
                }  
            };  
        };  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
              
            Timer timer = new Timer();  
            timer.scheduleAtFixedRate(new MyTask(), 1, 5000);  
        }  
              
        private class MyTask extends TimerTask{  
            @Override  
            public void run() {  
                  
                Message message = new Message();  
                message.what = 1;  
                mHandler.sendMessage(message);  
                  
            }     
        }  
          
          
        public void updateTitle(){  
              
            setTitle(hi~ " + title);  
            title ++;  
        }  
    }  




    
[2] Ubuntu 得到默认面板
    来源: 互联网  发布时间: 2014-02-18
Ubuntu 失去默认面板
按下 Alt+F2,输入以下内容并按回车
gconftool --recursive-unset /apps/panel
再次按下 Alt+F2,输入以下内容并按回车
rm -rf ~/.gconf/apps/panel
最后再次按下 Alt+F2,接着再输入以下内容并按回车
pkill gnome-panel
ok!

    
[3] [转]内存储器管理 - 内存使用不当小结
    来源: 互联网  发布时间: 2014-02-18
[转]内存管理 --- 内存使用不当小结

 

 

因为我们的应用程序能够使用的内存有限,所以在编写代码的时候需要特别注意内存

使用问题。如下是一些常见的内存使用不当的情况。 


 ⑴查询数据库没有关闭游标 

描述: 

    程序中经常会进行查询数据库的操作,但是经常会有使用完毕 Cursor后没有关闭的情

况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操

作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。 

  

示例代码: 

 

 

 

Cursor cursor = getContentResolver().query(uri ...); 
if (cursor.moveToNext()) { 
    ... ...  
} 

 

 

修正示例代码: 

 

 

Cursor cursor = null; 
try { 
    cursor = getContentResolver().query(uri ...); 
    if (cursor != null && cursor.moveToNext()) { 
        ... ...  
   } 
} finally { 
    if (cursor != null) { 
        try {  
            cursor.close(); 
        } catch (Exception e) { 
            //ignore this 
        } 
    } 
}  

 

 

⑵ 构造 Adapter时,没有使用缓存的 convertView 

 

 

描述: 

    以构造ListView的 BaseAdapter 为例,在BaseAdapter 中提高了方法: 

public View getView(int position, View convertView, ViewGroup parent) 

来向ListView提供每一个item所需要的view对象。初始时ListView会从BaseAdapter

中根据当前的屏幕布局实例化一定数量的view对象,同时ListView会将这些view对象

缓存起来。当向上滚动ListView时,原先位于最上面的list item 的 view对象会被回收,

然后被用来构造新出现的最下面的list item。这个构造过程就是由getView()方法完成的,

getView()的第二个形参 View convertView就是被缓存起来的list item的view对象(初始

化时缓存中没有view对象则convertView是null)。 

    由此可以看出,如果我们不去使用convertView,而是每次都在getView()中重新实例

化一个View对象的话,即浪费资源也浪费时间,也会使得内存占用越来越大。ListView

回收list item的view对象的过程可以查看: 

android.widget.AbsListView.java --> void addScrapView(View scrap) 方法。 

 

示例代码:

 

 

 

public View getView(int position, View convertView, ViewGroup parent) { 
    View view = new Xxx(...); 
    ... ... 
    return view; 
} 

 

 

修正示例代码: 

 

 

public View getView(int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView != null) { 
        view = convertView; 
        populate(view, getItem(position)); 
        ... 
    } else { 
        view = new Xxx(...); 
        ... 
    } 
    return view; 
}
 

 

⑶ Bitmap对象不在使用时调用 recycle()释放内存 

 

描述:

 

 

 有时我们会手工的操作Bitmap对象,如果一个Bitmap对象比较占内存,当它不在被

使用的时候,可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存,但这不是

必须的,视情况而定。可以看一下代码中的注释: 

    /** 

     * Free up the memory associated with this bitmap's pixels, and mark the 

     * bitmap as "dead", meaning it will throw an exception if getPixels() or 

     * setPixels() is called, and will draw nothing. This operation cannot be 

     * reversed, so it should only be called if you are sure there are no 

     * further uses for the bitmap. This is an advanced call, and normally need 

     * not be called, since the normal GC process will free up this memory when 

     * there are no more references to this bitmap. 

     */ 

 

  private void releaseBitmap(){ 
       
         //在这,我们分别预存储了第一个和最后一个可见位置之外的3个
位置的bitmap 
       
         //即dataCache中始终只缓存了(M=6+Gallery当前可见view的个
数)M个bitmap 
       
                     int start = mGallery.getFirstVisiblePosition()-3; 
       
                     int end = mGallery.getLastVisiblePosition()+3; 
       
                     Log.v(TAG, "start:"+ start); 
       
                     Log.v(TAG, "end:"+ end); 
       
                     //释放position<start之外的bitmap资源 
       
                     Bitmap delBitmap; 
       
                     for(int del=0;del<start;del++){ 
       
                             delBitmap = dateCache.get(del); 
       
                             if(delBitmap != null){ 
       
                                      //如果非空则表示有缓存的
bitmap,需要清理 
       
                                     Log.v(TAG, "release position:"+ 
del); 
       
                                     //从缓存中移除该del->bitmap的
映射 
       
                                     dateCache.remove(del); 
       
                                      delBitmap.recycle(); 
       
                             }
 

 

⑷ 释放对象的引用 

 

 

描述: 

    这种情况描述起来比较麻烦,举两个例子进行说明。 

示例A: 

假设有如下操作

 

 

public class DemoActivity extends Activity { 
    ... ... 
    private Handler mHandler = ... 
    private Object obj; 
    public void operation() { 
    obj = initObj(); 
    ... 
    [Mark] 
    mHandler.post(new Runnable() { 
           public void run() { 
            useObj(obj); 
           } 
    }); 
    } 
}

 

 

我们有一个成员变量 obj,在operation()中我们希望能够将处理obj实例的操作post

到某个线程的MessageQueue 中。在以上的代码中,即便是 mHandler 所在的线程使用

完了obj所引用的对象,但这个对象仍然不会被垃圾回收掉,因为 DemoActivity.obj还保

有这个对象的引用。所以如果在DemoActivity中不再使用这个对象了,可以在[Mark]的

位置释放对象的引用,而代码可以修改为:

 

 

... ... 
public void operation() { 
    obj = initObj(); 
    ... 
    final Object o = obj; 
    obj = null; 
    mHandler.post(new Runnable() { 
        public void run() { 
            useObj(o); 
        } 
    } 
} 
... ... 

 示例B: 

    假设我们希望在锁屏界面(LockScreen)中,监听系统中的电话服务以获取一些信息(如

信号强度等),则可以在LockScreen 中定义一个PhoneStateListener 的对象,同时将它

注册到TelephonyManager 服务中。对于LockScreen 对象,当需要显示锁屏界面的时候

就会创建一个LockScreen 对象,而当锁屏界面消失的时候LockScreen 对象就会被释放

掉。 

    但是如果在释放LockScreen 对象的时候忘记取消我们之前注册的

PhoneStateListener 对象,则会导致LockScreen无法被垃圾回收。如果不断的使锁屏界

面显示和消失,则最终会由于大量的LockScreen 对象没有办法被回收而引起

OutOfMemory,使得system_process进程挂掉。 

    总之当一个生命周期较短的对象A,被一个生命周期较长的对象B保有其引用的情况

下,在A的生命周期结束时,要在 B中清除掉对A的引用。

 

⑸其他 

 

 

Android 应用程序中最典型的需要注意释放资源的情况是在Activity的生命周期中,在

nPause()、onStop()、onDestroy()方法中需要适当的释放资源的情况。由于此情况很基

础,在此不详细说明,具体可以查看官方文档对Activity生命周期的介绍,以明确何时应

该释放哪些资源。 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3