• android总结


      进入公司后开始写程序,做了一个笑话软件,嵌套在浏览器中作为一个插件使用。这个应用做了不少时间,其实应用不是太难,但是自己的基础太不好,什么东西都不会写,都要查资料,耽误了大量时间,这也给了我一个教训,工作中复制代码后患无穷啊。

          该应用主要包括向服务器请求数据,解析xml,后台更新ui,处理一些屏幕响应事件等操作,都是一些很基础。代码实现过程中遇到了很多问题,有的到现在还没解决,还得急需考虑研究。

          问题1: 时间的格式化问题

          从服务器获取的数据是“2010-03-05 14:12:36”格式的,要将其转换为比较直观的“今天 14:12” 格式,遇到问题的原因主要是对java或者android的事件转换类不熟,此问题目前已经解决

    public static String getLocalTime(Context context, String time){
    // 取出年月日来,比较字符串即可
    String str_curTime = DateFormat.format("yyyy-MM-dd",new Date()).toString();
    int result = str_curTime.compareTo(time.substring(0,time.indexOf(" ")));
    if(result>0){
    return context.getString(R.string.haha_yesterday)+time.substring(time.indexOf(" "), time.lastIndexOf(":"));
    }
    else if(result==0){
    return context.getString(R.string.haha_today)+time.substring(time.indexOf(" "), time.lastIndexOf(":"));
    }
    else{
    return time;
    }
    }

     这个方法写的不够专业,但是满足了需要,网友们如果有更好的办法可以贴出来,另外一点就是推荐使用Android的DateFormat类,而不是使用java的SimpleDateFormat或是其他,Android的DateFormat类的转换效率要比java中的高很多。

      问题2:怎么减少ListView中的ItemView的布局层数

          这个已经写过,见以前的博客, 注明:使用merge标签做为顶层标签,虽然可以减少view的层级数,但是在merge标签里设置的各种属性都不会起作用,需要在代码中设置。

         问题3:中文字符设置bold格式

          

    mPublisher = (TextView) this.findViewById(R.id.haha_publisher);
    /**
    * 设置中文汉字的字体为bold,在xml文件中设置TextView的textstyle=bold 仅对英文字符有效,必须使用
    * 下述方法设置中文的字体为bold
    *
    */
    TextPaint tp
    = mPublisher.getPaint();
    tp.setFakeBoldText(
    true);

      问题4 : 一个小技巧

           view的setTag方法的使用,在Adapter中,如和将数据和view绑定到一起,例如处理onClick,onItemClick事件时,有时会需要获取该itemView的各种数据,例如positon,id,text啊等等,在getView方法中setTag后,在其他地方我们就可以通过使用getTag方法将这个信息描述对象取出来,直接使用里面的数据,能够使代码变的更整洁。

         问题5:异步加载图片  这个实验了好几种方式,都一起说说。

           第一种:

               在Adapter的getView方法中,判断该view是否有drawabel,如果没有,就发送一个消息,开启一个异步任务就下载图片。

                总结:这样做不好,因为ListView除了绘制当前显示界面的view之外,在上下滑动时,也会不断的调用getView方法,不断的去判断是否存在这个drawable,造成资源的浪费。此外这样可能会开启很多的异步任务,即使采用队列,也会增加不断判断这个图片是否已经下载过的成本。

              第二种:

               给ListView绑定scroll事件,这样做的好处是每次值加载当前界面上的几个view,而不会去下载所有的item的图片,这样的好处是节省流量,坏处是第一次加载完页面时不会去触发滚动事件,也就不会去下载第一页的图片,我更倾向于这样做,这样在加上队列,应该就很好了。

              

    mListView.setOnScrollListener(new OnScrollListener() {

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
      if(scrollState==OnScrollListener.SCROLL_STATE_IDLE){  
        int count = view.getChildCount();  
        if(count>0){  
          ArrayList
    <Integer> list = new ArrayList<Integer>();
          for(int index=0;index<count;index++){
            View vi
    = view.getChildAt(index);
            if(vi instanceof HahaItem){
              HahaItem item
    = (HahaItem) vi;
              HahaItemInfo info
    = (HahaItemInfo) item.getTag();  
              if(mAdapter.containsKey(info.userIconUrl)) continue;  
              list.add(item.id);
            }
          }
      ImageLoader loader
    = new ImageLoader(mHandler, list);
      MxTaskManager.getInstance().excuteTask(loader);
      }
      }
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
    int visibleItemCount, int totalItemCount) {

    }
    });

               

            第三种:当加载玩页面的时候,开启一个线程去下载所有的图片。

             在请求数据的异步任务中,解析xml文件,完成数据的封装,存储到Adapter中的集合中,并且同时存储到一个队列中,这个队列还不能是阻塞的,因为如果是阻塞的,有可能会阻塞请求数据的异步任务。同时这个队列还必须是线程安全的,否则我们自己还得自己手动的去实现同步。

             使用ConcurrentLinkedQueue这个类,他自己已经实现了同步。  

             当将所有的数据都添加到队列后,就要去检测下载图片的异步是否已经完成,如果完成了,就开启一个新的图片下载任务,如果没有完成,他会自动的去取队列中的数据,我们不同处理,这样能够减少频繁的开启关闭线程,提高效率。

              

    private class ImageLoader extends MxAsyncTaskRequest {
    private ConcurrentLinkedQueue<String> queue;

    public ImageLoader(Handler handler, int position) {
    super(handler, GETPIC_TASKID);
    }
    public ImageLoader(Handler handler, ConcurrentLinkedQueue<String> queue) {
    super(handler, GETPIC_TASKID);
    this.queue = queue;
    }
    @Override
    protected void doTaskInBackground() {
    while(true){
    if(queue.isEmpty()){
    break;
    }
    Log.i(tag,
    "doTaskInBackground is working: size "+queue.size());
    String url
    = queue.poll();
    Log.i(tag,
    "doTaskInBackground is working: url "+url);
    try {
    Drawable dw
    = AppUtils.loadDrawable(url);
    mAdapter.mDrawableMap.put(url, dw);
    }
    catch (IOException e) {
    e.printStackTrace();
    }
    }

    sendMessage(MSGID);
    }
    }

        问题6:dip和px的设置    ?

           在xml布局文件中我们既可以设置px,也可以设置dip,系统都为我们做了转换,但是在代码中怎么处理呢,很多方法都只提供了设置px的方法,例如setPadding,并没有提供设置dip的方法,按理说,应该将dip转换成px,但是转换之后,在高屏幕手机上反而出现了问题,视图变大,直接取得dimen中的数据后使用,反而不会出现任何问题,这让我很纠葛,难道方法中提供了自动转换,这个还得研究。

        问题7:TextView的布局 ?

         如果在TextView中显示多行文本的话,并且文本中包含数字,英文字母,就会出现排版问题,怎么解决?

         这里主要涉及到的类包括Paint,

         breakText方法,该方法能够检测一行显示多少文字。

  • 相关阅读:
    UINavigationController
    UIWebView
    控制器view的加载顺序initWithNibName >>> viewDidLoad >>> viewWillAppear >>> viewDidAppear
    UITableView
    JS调用OC方法
    【概念】winform的特点
    【概念】指针
    【c++】类的继承(三种继承方式)、基类和派生类、面向对象三要素
    【笔试】C++笔试题
    【c#】解决DataTable.Rows.Add(dr)语句执行速度慢的问题(GridControl)
  • 原文地址:https://www.cnblogs.com/moonvan/p/2017181.html
Copyright © 2020-2023  润新知