Android面试(二)ListView优化,ListView和Scrollview冲突问题,mvc模式,什么是ANR 如何避免它?

来源:互联网 发布:海岛奇兵辅助软件 编辑:程序博客网 时间:2024/05/01 23:35

1:ListView的优化

public class MainActivity extends Activity {
    private ListView listView;  
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); //去掉最上面的标题
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView1);
listView.setAdapter(new MyAdapter(this));
}

    ///定义静态内部类,entends   自  BaseAdapter。
static class MyAdapter extends BaseAdapter{
     private String [] titles = {"title1","title2","title3","title4","title5",};
private int [] icons = {
android.R.drawable.ic_input_add,
android.R.drawable.ic_delete,
android.R.drawable.ic_delete,
android.R.drawable.ic_delete,
android.R.drawable.ic_input_add,
 
};
private Context context;
public MyAdapter(Context context){
this.context = context;
}
 
     @Override
public int getCount() {
// TODO Auto-generated method stub
return titles.length;
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return titles[position];
}

@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
ViewHolder vh;

//第一步减少View
if(convertView==null){

LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.list_item_4, null);
vh = new ViewHolder();
vh.iv_icon = (ImageView) convertView.findViewById(R.id.imageView_icon);
vh.tv_title = (TextView) convertView.findViewById(R.id.textView_title);
convertView.setTag(vh);

}else{
vh = (ViewHolder) convertView.getTag();
}
//TextView tv_title = (TextView) convertView.findViewById(R.id.textView_title);
//ImageView iv_icon = (ImageView) convertView.findViewById(R.id.imageView_icon);

vh.tv_title.setText(titles[position]);
vh.iv_icon.setImageResource(icons[position]);
return convertView;
}

//定义静态内部类,用于第一次查找的组件,避免下次重复查找
static class ViewHolder{
ImageView iv_icon;            //图片控件
TextView tv_title;                 //标题控件

}
}
}


ListView优化总结:

  (1):新增一个内部类ViewHolder,用于对控件的实例进行缓存,(例如上面的ImageView,TextView);

   (2):当convertView为空时,创建ViewHolder对象,并将控件的实例放在ViewHolder中,然后调用setTag()方法,将ViewHolder对象存储在View中。

                当convertView不为空时,调用View的getTage()方法,把ViewHolder重新取出。

   (3):    创建ViewHolder主要是为了减少findViewById()的次数。

2:ListView和Scrollview冲突问题

       //自定义ListView

    public class MyListView extends ListView{

public MyListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}

public MyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}

//重写onMeasure方法
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub

            //重新获取屏幕的高度
heightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2, MeasureSpec.AT_MOST);

super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}


3:mvc模式:

   mvc是model,view,controller的缩写,mvc包含三个部分:

  l模型(model):是应用程序的主体部分,所有的业务逻辑都应该写在该层。

  l视图(view):是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的
  输入,显示处理结果。

  l控制器(control):是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种
导航功能,想用用户出发的相关事件,交给m处理。

   在android中mvc的具体体现如下:

    1)视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的
比较的多了话,就一定 可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和
javascript之间的通 信,幸运的是,android提供了它们之间非常方便的通信实现。

     2)控制层(controller):android的控制层的重 任通常落在了众多的acitvity的肩上,这句话也就暗含了不要
在acitivity中写代码,要通过activity交割model业务逻辑层处理, 这样做的另外一个原因是android中的acitivity的响应
时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。

      3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在
的该层的。

4:什么是ANR 如何避免它?

ANR:Application Not Responding,五秒在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时,Android就会显示ANR对话框了:

       对输入事件(如按键、触摸屏事件)的响应超过5秒

       意向接受器(intentReceiver)超过10秒钟仍未执行完毕

Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。因为此时,你的应用程序已经没有

机会去响应输入事件和意向广播(Intent broadcast)。

因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如onCreate()和 onResume()等更应如此。

如访问网络和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成 (或者是使用异步请求,如数据库操作)。


0 0
原创粉丝点击