2015.6项目经历总结

一、2015.6月-2015年12月 北京斯福德科技有限公司

负责项目:
1.365优生活(商城)
<1>套用自创框架:
一个类似异步线程的接口AsyncTaskListener:

      void initView();//初始化view
              void initData();//初始化数据
              void onBeforeTask(int taskId);//类似异步线程onPreExecute()
              Object onTask(int taskId, Object... params) throws Exception;                    //类似异步线程doInBackground()             
                   void onAfterTask(int taskId, Object result);//类似异步线程onPostExecute
                   void onTaskError(int taskId, Exception exception);//错误日志
一个继承异步线程的抽象类TqAsyncTask:
    public abstract class TqAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
    private Exception exception;
    public TqAsyncTask() {
    }
    @Override
    protected void onPreExecute() {
        onBeforeTask();
    }
    @Override
    protected Result doInBackground(Params... params) {
        try {
            return onTask(params);
        } catch (Exception e) {
            exception = e;
            return null;
        }
    }
    @Override
    protected void onPostExecute(Result result) {
        if (hasException()) {
            onTaskError(exception);
        } else {
            onAfterTask(result);
            cancel(true);
        }
    }
    private boolean hasException() {
        return exception != null;
    }

    abstract void onBeforeTask();
    abstract Result onTask(Params... params) throws Exception;
    abstract void onAfterTask(Result result);
    abstract void onTaskError(Exception exception);
}
一个继承自TqAsyncTask的类(主要作为在activity中new异步线程的使用):
public class TAsyncTask extends TqAsyncTask<Object, Void, Object> {
    private static final int DEFAULT_TASK_ID = 1000;
    private int mTaskID;
    private AsyncTaskListener mAsyncTaskListener;
    public int getTaskID() {
        return mTaskID;
    }
    public void setTaskID(int taskID) {
        this.mTaskID = taskID;
    }
    public TAsyncTask(AsyncTaskListener asyncTaskListener) {
        this(DEFAULT_TASK_ID, asyncTaskListener);
    }
    public TAsyncTask(int taskID, AsyncTaskListener asyncTaskListener) {
        super();
        this.mAsyncTaskListener = asyncTaskListener;
        setTaskID(taskID);
    }
    @Override
    void onBeforeTask() {
        mAsyncTaskListener.onBeforeTask(mTaskID);
    }
    @Override
    Object onTask(Object... params) throws Exception {
        return mAsyncTaskListener.onTask(mTaskID, params);
    }
    @Override
    void onAfterTask(Object result) {
        mAsyncTaskListener.onAfterTask(mTaskID, result);
    }
    @Override
    void onTaskError(Exception exception) {
        mAsyncTaskListener.onTaskError(mTaskID, exception);
    }
}
 一个继承activity/fragment并实现AsyncTaskListener的类:
public abstract class TBBaseAct extends Activity(Fragment) implements AsyncTaskListener {
    public Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            complete(msg);
        };
    };
    public abstract void complete(Message msg);
    public Handler getmHandler() {
        return mHandler;
    }
}

<2>优化处理图片(大量图片):
1. 尝试了网上通过BitmapFactory.Options来缩小图片大小均无效,还是会报出OOM;
2. 尝试通过缓存机制SoftReference来缓存网络下载的图片,通过WeakReference来防止内存泄漏,减缓了出现OOM的现象,并不能完全解决;
3.尝试通过缓存LruCache缓解内存异常,代码如下:

    int maxMemory = (int) Runtime.getRuntime().maxMemory();    
        int mCacheSize = maxMemory / 8;  
        //给LruCache分配1/8 4M  
        mMemoryCache = new LruCache<String, Bitmap>(mCacheSize){  

            //必须重写此方法,来测量Bitmap的大小  
            @Override  
            protected int sizeOf(String key, Bitmap value) {  
                return value.getRowBytes() * value.getHeight();  
            }  

        };  

4.尝试通过缓存LruCache存储图片,并将图片放到sdcard里,这样图片很流畅,但还是会出现OOM;
解决:使用第三方jar afinal.jar/universal-image-loader.jar解决;
<3>对afinal.jar/universal-image-loader.jar了解的基本概念:
(1) RequestManager:请求生成和管理模块
(2) Engine:引擎部分,负责创建任务(获取数据),并调度执行
(3) GetDataInterface:数据获取接口,负责从各个数据源获取数据。
比如 MemoryCache 从内存缓存获取数据、DiskCache 从本地缓存获取数据,下载器从网络获取数据等。
(4) Displayer:资源(图片)显示器,用于显示或操作资源。
比如 ImageView,这几个图片缓存都不仅仅支持 ImageView,同时支持其他 View 以及虚拟的 Displayer 概念。
(5) Processor 资源(图片)处理器负责处理资源,比如旋转、压缩、截取等。

题外:并对其他缓存图片的jar提供链接:http://p.codekk.com/?s=图片缓存

<4>fragmentActivity切换fragment时,数据刷新问题:

    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.user_order_list);

        //3个fragment
        ncFrag = new UserNoCompleteFrag();
        ycFrag = new UserYesCompleteFrag();
        thFrag = new UserTuihuoComleteFrag();
        mFragments = new Fragment[3];
        mFragments[0] = ncFrag;
        mFragments[1] = ycFrag;
        mFragments[2] = thFrag;

        fragmentManager = getSupportFragmentManager();
        fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.show_order_view, ncFrag);
        fragmentTransaction.add(R.id.show_order_view, ycFrag);
        fragmentTransaction.add(R.id.show_order_view, thFrag);
        fragmentTransaction.hide(mFragments[0]).hide(mFragments[1])
                .hide(mFragments[2]);
    }

@Override
    protected void onStop() {
        super.onStop();
        if (null != ncFrag) {
            ncFrag.onDestroy();
            ncFrag = null;
        }
        if (null != ycFrag) {
            ycFrag.onDestroy();
            ycFrag = null;
        }
        if (null != thFrag) {
            thFrag.onDestroy();
            thFrag = null;
        }
    }

public void onClick(View arg0) {
    fragmentManager.beginTransaction().hide(mFragments[0]).hide(mFragments[1]).hide(mFragments[2]).show(mFragments[0]).commit();
}

<5>adapter刷新,当每个item布局不一致时,采用如下方法

HashMap<Integer, View> lmap = new HashMap<Integer, View>();

public View getView(int arg0, View convertView, ViewGroup arg2) {
        ViewHolder vh = null;
        if (lmap.get(arg0) == null) {
        vh = new ViewHolder();
        ....
        }else {
            convertView = lmap.get(arg0);
            vh = (ViewHolder) convertView.getTag();
        }
}


以上若有问题,请同学指正哈。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值