2015.6项目经历总结

来源:互联网 发布:qq音乐 知乎 编辑:程序博客网 时间:2024/05/22 17:39

一、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