Coder Social home page Coder Social logo

yangfuhai / afinal Goto Github PK

View Code? Open in Web Editor NEW
3.2K 3.2K 1.5K 4.13 MB

Afinal是一个android的ioc,orm框架,内置了四大模块功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通过finalActivity,我们可以通过注解的方式进行绑定ui和事件。通过finalBitmap,我们可以方便的加载bitmap图片,而无需考虑oom等问题。通过finalDB模块,我们一行代码就可以对android的sqlite数据库进行增删改查。通过FinalHttp模块,我们可以以ajax形式请求http数据。详情请通过以下网址查看。

Java 100.00%

afinal's Issues

获取本地缓存出现OOM

UYL0HBMC ER_D_ CNXCX47

我的配置是这样的:
fb = FinalBitmap.create(this, "/mmworld/cache", (float) 0.5, 10, 5);
为什么会出现这个情况呢

各种问题,不太会用。

强烈要求上完整的sample,就试了下orm报了一大堆的错误。
不得不看源码逐步排查问题,总体来说赞一个。留个联系方式或者与我取得联系。 fangqing.fan#hotmail.com

几个问题请教

  • 这个库和aquery的大多数功能重叠, 除了orm, 作者觉得特色在什么地方
  • 有没有和诸如ormlite一类的orm的性能对比?

希望添加maven支持

现在项目结构有点乱,而且缺乏对应的测试文件,希望能够使用maven或者类似物

afinal_0.5_bin.jar,onClick函数无法调用

1.使用afinal_0.5_bin.jar包时,btnClick函数不调用,求解?
public class MainUI extends FinalActivity {
@ViewInject(id=R.id.btnGotoUI,click="btnClick")Button btn;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_ui);
}
public void btnClick(View v) {
Log.e("MSG", "btnClick is called...");
}
}
ps:但使用afinal-0.3.32-bin.jar时,一切正常。

升级数据库版本时出现 sql 异常

SqliteDbHelper.onUpgrade() 的默认操作:
db.execSQL("DROP TABLE "+cursor.getString(0));

会出现 table sqlite_sequence may not be dropped 的异常.

修正:
try {
db.execSQL("DROP TABLE "+cursor.getString(0));
} catch (SQLException e) {
android.util.Log.d("Debug SQL", ">>>>>> "+e.getMessage());
}

FinalHTTP下载功能

支持了断点续传以后,不知道是因为下载地址的原因还是什么,反复使用handler.stop然后又重新启动下载后,容易出现无法启动下载或者下载成功后是一个错误的文件。
而且回调接口的onFailure的返回信息都是String类型,判断起来非常不方便

FinalDB在正式打包后不能正常初始化

在模拟器上跑没有问题,用电脑连接手机安装进去也没有问题,但签名打包后,发到手机里面,发现数据库初始化出错,已经确定是数据库问题了,请问如何解决?

dropDb报错

源代码
Cursor cursor = db.rawQuery("SELECT name FROM sqlite_master WHERE type ='table' ", null);
修改成
Cursor cursor = db.rawQuery("SELECT name FROM sqlite_master WHERE type ='table' and name !='sqlite_sequence' ", null);

mFinalBitmap.configRecycleImmediately(true)后在单activity中载入大量listview复用图片,出现lrucache中的bug,设置mFinalBitmap.configRecycleImmediately(false)后表现良好

08-19 14:21:32.561: E/AndroidRuntime_4_crash(20721): Caused by: java.lang.IllegalStateException: net.tsz.afinal.bitmap.core.SoftMemoryCacheImpl$1.sizeOf() is reporting inconsistent results!
08-19 14:21:32.561: E/AndroidRuntime_4_crash(20721): at net.tsz.afinal.bitmap.core.LruMemoryCache.trimToSize(LruMemoryCache.java:140)
08-19 14:21:32.561: E/AndroidRuntime_4_crash(20721): at net.tsz.afinal.bitmap.core.LruMemoryCache.put(LruMemoryCache.java:126)
08-19 14:21:32.561: E/AndroidRuntime_4_crash(20721): at net.tsz.afinal.bitmap.core.SoftMemoryCacheImpl.put(SoftMemoryCacheImpl.java:42)
08-19 14:21:32.561: E/AndroidRuntime_4_crash(20721): at net.tsz.afinal.bitmap.core.BitmapCache.addToMemoryCache(BitmapCache.java:90)
08-19 14:21:32.561: E/AndroidRuntime_4_crash(20721): at net.tsz.afinal.FinalBitmap$BitmapLoadAndDisplayTask.doInBackground(FinalBitmap.java:719)
08-19 14:21:32.561: E/AndroidRuntime_4_crash(20721): at net.tsz.afinal.FinalBitmap$BitmapLoadAndDisplayTask.doInBackground(FinalBitmap.java:1)
08-19 14:21:32.561: E/AndroidRuntime_4_crash(20721): at net.tsz.afinal.core.AsyncTask$2.call(AsyncTask.java:145)
08-19 14:21:32.561: E/AndroidRuntime_4_crash(20721): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
08-19 14:21:32.561: E/AndroidRuntime_4_crash(20721): ... 4 more

关于请求异常问题

getSync, postSync这个两个方法都没有抛出异常,我在项目里使用的时候就是请求不到数据,也不抛出异常,很是郁闷啊,为什么不抛出异常信息呢?

关于磁盘缓存的问题

简单用了一下这个框架,挺不错的,但是在使用finalBitmap的时候遇到一个问题,不知道是不是bug.
我只是使用了FinalBitmap.display方法,url地址指向一个网上的图片。每次我关闭activity之后,图片都会再次从web上读取,而不是从sdcard的cache中读取。我看了一下cache目录,那个文件应该是存在的,但是没有被读取,而且从web上再次读取图片的时候会将原来的缓存图片删除。
挺看好这个框架,感觉简单好用,谢谢。

代码混淆

如果我想打混淆包,需要在progurd里面添加什么

AsynTask有个bug

android.os.AsynTask有个bug,具体看底部文件,这个是因为android SDK 低于11是不支持支持设置并发的,所以当指向executeOnExecutor方法的时候会有爆方法不存在的错误,建议继承自定义的AsynTask而不是系统的,我开了个gist,这个类在这里: https://gist.github.com/inmyfree/5334766

附送 stackflow 问题讨论和解决方案:
http://stackoverflow.com/questions/7211684/asynctask-executeonexecutor-before-api-level-11

错误日记:

QQ20130408-2 2x

关于closeCache 内存没有下降的问题

调用 closeCache 后内存没有下降是什么问题 ?

目前我们的环境是 .一个全局单例对象 . 包含两个FinalBitmap对象 . 在用户选择注销并清理缓存数据的时候 分别调用

closeCache()

clearCache()

并将全局单例对象设置成null

重新登陆内存会增加5M , 注 销登陆重复这个过程每次会增加5M 左右

HttpTools中文乱码

使用版本为0.3.1时。
获取一个GB2312格式的页面源码出现乱码。

问题应该是net.tsz.afinal.http.entityhandler.StringEntityHandler类中的handleEntity()方法。
最后return的是UTF-8,所以有问题。

FinalDB不用Close么?

自己通过SQLiteOpenHelper或者Context或者SQLiteDatabase之后,基本都需要明显调用close
在FinalDB中没看到相关的源码,难道不需要么?

修改findAllBySql 并重载

/**
 * 根据条件查找所有数据
 * @param clazz
 * @param strSQL
 */
public <T> List<T> findAllBySql(Class<T> clazz,String strSQL){
    return findAllBySql(clazz, true, strSQL);
}

/**
 * 根据条件查找所有数据
 * @param clazz
 * @param isCheckTable 为false时 ,该类不调用checkTableExist()方法,不会在数据库中自动 建表
 * @param strSQL
 */
public <T> List<T> findAllBySql(Class<T> clazz,Boolean isCheckTable,String strSQL){
    if(isCheckTable==true){checkTableExist(clazz);}
    debugSql(strSQL);
    Cursor cursor = db.rawQuery(strSQL, null);
    try {
        List<T> list = new ArrayList<T>();
        while(cursor.moveToNext()){
            T t = CursorUtils.getEntity(cursor, clazz,this);
            list.add(t);
        }
        return list;
    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        if(cursor!=null)
            cursor.close();
        cursor=null;
    }
    return null;
}

1.将findAllBySql private属性更改为public属性。这样就支持我们手写一些复杂的SQL了。
2.修改原有findAllBySql 方法,并增加了一个重载方法。

原来方法调用,会自动在数据库中建立 UserView的表,其实我们UserView只是前台视图,是不需要建表的。
List userList = db.findAllBySql(UserView.class,"select * from user_test a,user_child b where a.id = b.parentId");

调用时:
List userList = db.findAllBySql(UserView.class,false,"select * from user_test a,user_child b where a.id = b.parentId");
第二个参数为false时,系统就不执行checkTableExist 方法,就不会自动建立UserView这个表了。

FinalDB不能读取最新的db文件

应用在运行的过程中,下载一个db文件,覆盖原来的文件,FinalDB读取的还是原来db中的内容,但是直接通过SQLiteDatabase去读取,是能读取到最新的内容的。
FinalDB不用关闭或释放资源吗?

关闭网络状态下,FinalHttp在执行Get请求的时候报了Runtime异常

打印了一下异常。是个崩溃bug
java.lang.RuntimeException: An error occured while executing doInBackground()
at net.tsz.afinal.common.AsyncTask$3.done(AsyncTask.java:160)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.NullPointerException
at net.tsz.afinal.http.RetryHandler.retryRequest(RetryHandler.java:79)
at net.tsz.afinal.http.AjaxRequestHandler.makeRequestWithRetries(AjaxRequestHandler.java:83)
at net.tsz.afinal.http.AjaxRequestHandler.doInBackground(AjaxRequestHandler.java:106)
at net.tsz.afinal.common.AsyncTask$2.call(AsyncTask.java:148)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
... 4 more
java.lang.NullPointerException
at net.tsz.afinal.http.RetryHandler.retryRequest(RetryHandler.java:79)
at net.tsz.afinal.http.AjaxRequestHandler.makeRequestWithRetries(AjaxRequestHandler.java:83)
at net.tsz.afinal.http.AjaxRequestHandler.doInBackground(AjaxRequestHandler.java:106)
at net.tsz.afinal.common.AsyncTask$2.call(AsyncTask.java:148)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)

[question] 请问一下,代码里重写AsyncTask的目的是什么?

你的注释写的是“修改了线程池属性,让并发线程按顺序执行”,我和Android源码对比了下,发现改动的地方以下几处:

1、
public Thread newThread(Runnable r) {
return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
}

-->

public Thread newThread(Runnable r) {
Thread tread = new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
tread.setPriority(Thread.NORM_PRIORITY - 1);
return tread;
}

2、
public static final Executor SERIAL_EXECUTOR = Utils.hasHoneycomb() ? new SerialExecutor() :
Executors.newSingleThreadExecutor(sThreadFactory);

-->

public static final Executor SERIAL_EXECUTOR = new SerialExecutor();

3、
public static final Executor DUAL_THREAD_EXECUTOR =
Executors.newFixedThreadPool(2, sThreadFactory);

-->

public static final Executor DUAL_THREAD_EXECUTOR =Executors.newFixedThreadPool(3, sThreadFactory);

我觉得你的改动主要是(2),我想问的是你这么改的目的是什么,为什么必须让他顺序执行,不顺序执行的话,会有什么问题啊?

关于不支持父类属性的问题

我在创建类的时候,将公共属性提到一个单独的类中,所有类都继承该公共类.结果出现问题,发现你在反射获取属性的时候发现使用的是 getDeclaredFields()

如果要实现可以继承父类的话该如何做?
我想把所有用到 getDeclaredFields() 的地方都抽成一个方法,如下
ClassUtils.getFields(Class<?> clazz){return clazz.getDeclaredFields();}

然后,针对我的问题,我能不能 override 这个方法,改成 return clazz.getFields();
这样就支持父类了.

java 新手,不知这样可行与否?

0.5版本上ViewInject @click注释失效问题

将jar替换成0.5版本之后,发现click方法无法被调用,打印如下日志:
java.lang.IllegalArgumentException: object is not an instance of the class
at java.lang.reflect.Field.getField(Native Method)
at java.lang.reflect.Field.get(Field.java:237)
at net.tsz.afinal.FinalActivity.setViewClickListener(FinalActivity.java:129)
at net.tsz.afinal.FinalActivity.initInjectedView(FinalActivity.java:103)
at net.tsz.afinal.FinalActivity.initInjectedView(FinalActivity.java:70)
at net.tsz.afinal.FinalActivity.setContentView(FinalActivity.java:39)
查看源码发现0.5版本与0.3版本FinalActivity的initInjectedView(Object injectedSource,View sourceView)方法中存在差异:
0.3版本:
String clickMethod = viewInject.click();
if(!TextUtils.isEmpty(clickMethod))
setViewClickListener(injectedSource,field,clickMethod);
0.5版本:
String clickMethod = viewInject.click();
if(!TextUtils.isEmpty(clickMethod))
setViewClickListener(sourceView,field,clickMethod);

回调函数的处理有问题

如果网速比较慢,在一个activity里面发起了http请求。在请求过程中用户跳转到其他的activity,这时候如果触发onSuccess之类的回调函数,程序就会出错误。因为被操作的对象已经不存在了。

部分机型初始化图片缓存时出现内存溢出

异常信息:
java.lang.OutOfMemoryError
java.util.HashMap.makeTable(HashMap.java:555)
java.util.HashMap.(HashMap.java:158)
net.tsz.afinal.bitmap.core.SoftMemoryCacheImpl.(SoftMemoryCacheImpl.java:28)
net.tsz.afinal.bitmap.core.BitmapCache.init(BitmapCache.java:64)
net.tsz.afinal.bitmap.core.BitmapCache.(BitmapCache.java:49)
net.tsz.afinal.FinalBitmap.init(FinalBitmap.java:239)
net.tsz.afinal.FinalBitmap.doDisplay(FinalBitmap.java:327)
net.tsz.afinal.FinalBitmap.display(FinalBitmap.java:264)

SoftMemoryCacheImpl 设置大小时,默认值过大导致

无法加载本地图片

SimpleDownloader类中的getFromFile,使用了FileReader,没进行关闭,造成decode为bitmap的时候结果为空。
1、关闭流
2、使用字节读取
即可修复。

private byte[] getFromFile(String urlString) {
FileInputStream f = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
f = new FileInputStream(new File(urlString));
int b;
while ((b = f.read()) != -1) {
baos.write(b);
}
byte[] bb= baos.toByteArray();
return bb;
} catch (Exception e) {
e.printStackTrace();
}finally{
if(f!=null){
try {
f.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

    return null;
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.