当前位置:  编程技术>移动开发
本页文章导读:
    ▪party_bid 项目之 复建        party_bid 项目之 重构 1.圈复杂度(Cyclomatic Complexity)   是一种代码复杂度的衡量标准。它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的.........
    ▪ [有关问题解决]个推SDK使用侧记 - 多个账号注册导致的有关问题        [问题解决]个推SDK使用侧记 -- 多个账号注册导致的问题 这是我们项目最近用到的东西,用来实现消息推送。 (还不了解“个推”的朋友可以看看:http://www.igetui.com   一开始我们使用了测试.........
    ▪ ListView 带有多个Item布局时,convertView的缓存与重用       ListView 含有多个Item布局时,convertView的缓存与重用 最近有需求需要在listView中载入不同的listItem布局,若这样写 public View getView(int position, View convertView, ViewGroup parent) {  View view = new Xxx(...); .........

[1]party_bid 项目之 复建
    来源: 互联网  发布时间: 2014-02-18
party_bid 项目之 重构

1.圈复杂度(Cyclomatic Complexity)

  是一种代码复杂度的衡量标准。它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的可能错误和高的圈复杂度有着很大关系。

  在之前的开发中,代码中的for循环和if - else if -else句随处可见,而且其中经常会嵌套另一层循环等,例如冒泡排序算法。这样就会使程序的圈复杂度提高,并且降低了程序的可维护性和健壮性。 

  在重构中,通过合并条件分支,合并后可用boolean变量来替换条件分支中的语句以及underscore取代for循环。例如:

  

function bid_result(priceLists,priceNumber)
{
    var count = _.chain(priceLists)
        .sortBy("price")
        .groupBy(function(price){
        return price.price;
    })
    _.map(count._wrapped, function (value,key) {
        priceNumber.push({'price': key, 'number': value.length,'value':value});
    })

    save_localStorage("localStorage_bid_results",priceNumber);
}

function get_result(bid_results)
{
    return _.find(bid_results,function(list)
    {
        return list.number == 1;
    });
}

 2.面向对象编程

  javascript语言是基于原型的面向对象方式,对象依靠构造器(constructor)利用原型(prototype)构造出来的。在对数据进行增删改查等操作时,可以通过调用对象实例的方法来实现具体的操作,从而可以节省数据间的传送。  

function Activity(put)
{
    this.title = put,
    this.disabled = false,
    this.color = "",
    this.bid=0
}

//save
Activity.prototype.save = function () {
    var list = Activity.get_activities();
    list.unshift(this);
    save_localStorage("localEventsLists",list);
}

Activity.get_activities = function () {
    return JSON.parse(localStorage.getItem("localEventsLists")) || [];
};


 3.

 

 


    
[2] [有关问题解决]个推SDK使用侧记 - 多个账号注册导致的有关问题
    来源: 互联网  发布时间: 2014-02-18
[问题解决]个推SDK使用侧记 -- 多个账号注册导致的问题

这是我们项目最近用到的东西,用来实现消息推送。

(还不了解“个推”的朋友可以看看:http://www.igetui.com

 

一开始我们使用了测试账号进行测试,可以正常接收到推送,然后新注册了一个正式的账号,并给同一款软件进行登记,却发现无论如何也不能收到推送消息了(能获取到clientID),应用卸载重装也无效。。。

 

<!--

无奈之下只好指点客服问问,可惜周末啊,抱着试试的心态(毕竟项目也急)。。。然后北京的打通了,可是技术周末没在,倒是客服哥哥好心肠给了技术经理的电话。。。

-->

 

解决办法:删除SD卡根目录下的libs/目录,再重新安装即可。(估计是里面包含了一些账号数据的,就冲突了

*其实,一般发布后就不会怎么再改动或更新账号就好,但是如果一旦更变,就必须手动去删除,多少有点不够智能


    
[3] ListView 带有多个Item布局时,convertView的缓存与重用
    来源: 互联网  发布时间: 2014-02-18
ListView 含有多个Item布局时,convertView的缓存与重用

最近有需求需要在listView中载入不同的listItem布局,若这样写

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

没有使用缓存的 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对象的话,即浪费资源也浪费时间,也会使得内存占用越来越大。

修正示例代码:
public View getView(int position, View convertView, ViewGroup parent) {
  View view = null;
  if (convertView != null) {
  view = convertView;
  ...
  } else {
  view = new Xxx(...);
  ...
  }
  return view;
}

上述代码很好的解决了内存泄露的问题,使用convertView回收一些布局供下面重构是使用。

但是如果出现如下图的需求,convertView就不太好用了,convertView在Item为单一的布局时,能够回收并重用,但是多个Item布局时,convertView的回收和重用会出现问题。




Listview中有3种Item布局,即使convertView缓存了一些布局,但是在重构时,根本不知道怎么样去让convertView返回你所需要的布局,这时你需要让adapter知道我当前有哪些布局,我重构Item时的布局选取规则,好让convertView能返回你需要的布局

需要重写一下两个函数

@Override

public int getItemViewType(int position) {}

 

 

上述两个函数的作用这如它的名字,得到Item的样式,得到所有的样式数量

下面直接上代码,就是上图的实现代码:

 

package com.bestv.listViewTest;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

public class listViewTest extends Activity {
/** Called when the activity is first created. */
ListView listView;
MyAdapter listAdapter;
ArrayList<String> listString;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView)this.findViewById(R.id.listview);
listString = new ArrayList<String>();
for(int i = 0 ; i < 100 ; i++)
{
listString.add(Integer.toString(i));
}
listAdapter = new MyAdapter(this);
listView.setAdapter(listAdapter);
}

class MyAdapter extends BaseAdapter{

Context mContext;
LinearLayout linearLayout = null;
LayoutInflater inflater;
TextView tex;
final int VIEW_TYPE = 3;
final int TYPE_1 = 0;
final int TYPE_2 = 1;
final int TYPE_3 = 2;

public MyAdapter(Context context) {
// TODO Auto-generated constructor stub
mContext = context;
inflater = LayoutInflater.from(mContext);
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return listString.size();
}

//每个convert view都会调用此方法,获得当前所需要的view样式
@Override
public int getItemViewType(int position) {
// TODO Auto-generated method stub
int p = position%6;
if(p == 0)
return TYPE_1;
else if(p < 3)
return TYPE_2;
else if(p < 6)
return TYPE_3;
else
return TYPE_1;

}

@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 3;
}

@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return listString.get(arg0);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
viewHolder1 holder1 = null;
viewHolder2 holder2 = null;
viewHolder3 holder3 = null;
int type = getItemViewType(position);


//无convertView,需要new出各个控件
if(convertView == null)

Log.e("convertView = ", " NULL");

//按当前所需的样式,确定new的布局
switch(type)
{
case TYPE_1:
convertView = inflater.inflate(R.layout.listitem1, parent, false);
holder1 = new viewHolder1();
holder1.textView = (TextView)convertView.findViewById(R.id.textview1);
holder1.checkBox = (CheckBox)convertView.findViewById(R.id.checkbox);
Log.e("convertView = ", "NULL TYPE_1");
convertView.setTag(holder1);
break;
case TYPE_2:
convertView = inflater.inflate(R.layout.listitem2, parent, false);
holder2 = new viewHolder2();
holder2.textView = (TextView)convertView.findViewById(R.id.textview2);
Log.e("convertView = ", "NULL TYPE_2");
convertView.setTag(holder2);
break;
case TYPE_3:
convertView = inflater.inflate(R.layout.listitem3, parent, false);
holder3 = new viewHolder3();
holder3.textView = (TextView)convertView.findViewById(R.id.textview3);
holder3.imageView = (ImageView)convertView.findViewById(R.id.imageview);
Log.e("convertView = ", "NULL TYPE_3");
convertView.setTag(holder3);
break;
}
}
else
{
//有convertView,按样式,取得不用的布局
switch(type)
{
case TYPE_1:
holder1 = (viewHolder1) convertView.getTag();
Log.e("convertView !!!!!!= ", "NULL TYPE_1");
break;
case TYPE_2:
holder2 = (viewHolder2) convertView.getTag();
Log.e("convertView !!!!!!= ", "NULL TYPE_2");
break;
case TYPE_3:
holder3 = (viewHolder3) convertView.getTag();
Log.e("convertView !!!!!!= ", "NULL TYPE_3");
break;
}
}

//设置资源
switch(type)
{
case TYPE_1:
holder1.textView.setText(Integer.toString(position));
holder1.checkBox.setChecked(true);
break;
case TYPE_2:
holder2.textView.setText(Integer.toString(position));
break;
case TYPE_3:
holder3.textView.setText(Integer.toString(position));
holder3.imageView.setBackgroundResource(R.drawable.icon);
break;
}


return convertView;
}

}


//各个布局的控件资源

class viewHolder1{
CheckBox checkBox;
TextView textView;
}
class viewHolder2{
TextView textView;
}
class viewHolder3{
ImageView imageView;
TextView textView;
}
}

 

在getView()中需要将不同布局进行缓存和适配,系统在判断是否有convertView时,会自动去调用getItemViewType (int position) ,查看是否已经有缓存的该类型的布局,从而进入if(convertView == null)和else{}的判断。期间需要做的是convertView.setTag(holder3),以便在convertView重用时可以直接拿到该布局的控件,holder3 = (viewHolder3) convertView.getTag()。到这一步,convertView的回收和重用就已经写好了,接下来只需要对你的不同的控件进行设置就行了。


    
最新技术文章:
▪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