1. 对于ListView的优化
使用BindView函数专门处理数据与视图绑定的操作
getItem函数与getItemId函数不是在需要的时候才去重写的,而是必须根据自身应用的实际情况对其进行修改,比如getItemId,不一定是返回position,也可以返回list集合中的相应位置上元素的ID
视实际情况而定,当要适配到视图条目上的数据对象为空时,如有需要应该对视图也进行更新,否则到时候显示给用户的将是该条试图条目上原本的数据而不是空数据
使用自定义ViewHolder对控件进行初始化,避免多次findViewById2. Activity中控件以及桌面插件的界面刷新
目前操作过于繁琐而且也没有必要,可以统一通过对网络状态改变的事件进行监听,从而对APN、WIFI的界面显示进行相应的更新,同时可以考虑对中间状态也进行获取,并且当处于中间状态时控件应该是不可被操作的
以刷新Swicher为例:
//定义对网络进行监控的广播接收者
public class SwitcherNetworkStatusMonitor extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
updateSwitchWifiView();
} else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
updateSwitchApnView();
}
}
}
//更新Wifi控件函数
public void updateSwitchWifiView() {
if (switchWIFI != null) {
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
int wifiStatus = wifiManager.getWifiState();
if (wifiStatus == WifiManager.WIFI_STATE_ENABLED) {
switchWIFI.setChecked(true);
} else if (wifiStatus == WifiManager.WIFI_STATE_DISABLED) {
switchWIFI.setChecked(false);
}
}
}
//更新Apn控件函数
public void updateSwitchApnView() {
if (switchAPN != null) {
NetworkManager networkManager = new NetworkManager(
getApplicationContext());
if (networkManager.isApnOpened()) {
switchAPN.setChecked(true);
} else {
switchAPN.setChecked(false);
}
}
}
//在onStart()函数中对BroadcastReceiver进行注册以及控件的初始化
@Override
protected void onStart() {
super.onStart();
switchAPN = (Switch) findViewById(R.id.apn_switcher);
switchWIFI = (Switch) findViewById(R.id.wifi_switcher);
mSwitcherNetworkStatusMonitor = new SwitcherNetworkStatusMonitor();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
registerReceiver(mSwitcherNetworkStatusMonitor, intentFilter);
}
//在onStop()函数中注销掉BroadcastReceiver
@Override
protected void onStop() {
unregisterReceiver(mSwitcherNetworkStatusMonitor);
super.onStop();
}
3. 理解PendingIntent创建时flags参数的含义
4. 对于每个类、每个方法要明确它们的角色和分工,每个变量的位置也要放在适合它们的位置,比如视图变量就不应放在广播接收者中
5. 内部类和外部类学习
6. Static作用
静态代码块:在项目启动的时候项目代码块就会被执行,静态方法在类加载的时候就已经加载了,但是要在被调用的时候静态方法才会执行。
由于静态内部类只能访问外部类中的静态成员,而findViewById等方法都是非静态的,这样可以避免该类持有一些不必要的对象,长期地持有诸如控件等试图资源甚至是Activity或者上下文环境会导致这些资源长期驻扎在内存中得不到释放,最终导致内存泄露。
7. 数据库并行问题通过扩展Application进而在整个应用程序的启动时开启数据库,终结时关闭数据库。应用程序的服务是运行在程序的进程上的,当程序进程被终结了,服务也就不存在了。
创建ENApplication类继承Application实现onCreate()与onTerminate()方法
@Override
public void onCreate() {
super.onCreate();
DatabaseUtil.openDatabase(getApplicationContext());
}
@Override
public void onTerminate() {
DatabaseUtil.closeDatabase();
super.onTerminate();
}
8. 扩展系统视图或者系统服务时,在创建时候应该让系统先创建自己的内容,进而再执行我们的操作,而在销毁时,应该先销毁我们的内容再执行系统的销毁操作。如在onCreate()函数时先调用super.onCreate(),在实现自己的操作,而在onDestroy()时,先销毁自定义的内容再调用super.onDestroy()