一、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();
}
}
以上若有问题,请同学指正哈。