Sugar ORM在初始化时阻塞UI线程

3

我正在使用版本为1.3.1的Sugar ORM来开发我的Android 5.1应用程序。

今天,我注意到在安装我的应用程序后,Sugar ORM会在初始化过程中阻止UI线程约2.4秒钟。

是否有一种方法可以在后台线程中完成这项工作以改善用户体验?

04-07 20:14:42.179  10407-10407/com.sample.app I/Sugar﹕ on create
04-07 20:14:44.354  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.358  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.358  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.360  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.362  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.365  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.366  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.368  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.370  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.372  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.373  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.375  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.377  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.378  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.380  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.381  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.383  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.385  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.389  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.390  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.392  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.395  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.397  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.399  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.400  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.402  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.402  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.405  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.406  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.407  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.407  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.408  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.409  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.410  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.411  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.412  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.413  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.414  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.415  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.415  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.416  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.417  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.418  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.418  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.420  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.420  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.420  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.421  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.421  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.422  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.422  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.423  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.423  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.424  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.425  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.426  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.427  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.427  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.429  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.429  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.430  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.431  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.431  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.432  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.432  10407-10407/com.sample.app I/Sugar﹕ domain class
04-07 20:14:44.506  10407-10407/com.sample.app I/Sugar﹕ create table
04-07 20:14:44.506  10407-10407/com.sample.app D/Sugar﹕ Fetching properties
04-07 20:14:44.507  10407-10407/com.sample.app I/Sugar﹕ creating table ARTICLE

这似乎是一个功能:https://github.com/satyan/sugar/issues/269#issuecomment-90805581。欢迎任何解决方法... - 0xPixelfrost
没有变通方法,也没有修复bug的必要 -> 我转而使用ActiveAndroid: https://github.com/pardom/ActiveAndroid - 0xPixelfrost
1个回答

5

正如您建议的那样,将数据库初始化放在后台任务中是我能想到的最简单的解决方案。 首先,我猜您已经注意到,当您使用继承了SugarRecord的对象时,第一次启动sugar的创建工作开始。所以我会在应用程序启动的开头(当然是在后台)执行此操作。下面是我的做法:

  1. First I've defined an object just like this:

    public class DBInit extends AsyncTask<Void,Void,Void> {
    @Override
    protected Void doInBackground(Void... params) {
            Offer.last(Offer.class);
            return null;
        }
    }
    

    Where Offer is a custom object of mine that extends SugarRecord. That is, by performing a dummy search I trigger the DB creation.

  2. I launch this task as soon as possible in the app initialization. For instance in the onCreate, just like this:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_screen);
    
        // Init the data base in a AsyncTask
        DBInit dbInit = new DBInit();
        dbInit.execute();
    }
    
我希望您能发现这个解决方法足够有用。
编辑:如果您使用没有 .last() 方法的版本,您可以通过执行 Offer.listAll(Offer.class) 来达到相同的效果,而不是 Offer.last(Offer.class)。然而,我会避免这样做,因为您可能会拉取您在其中存储的数百或数千个对象。因此,在我的项目中,我定义了一个抽象类,并让我的对象从这个类继承,而不是从 SugarRecord 继承,请看下面的示例:
public abstract class BaseSugarRecord extends SugarRecord{

    public static <T extends SugarRecord> T checkFor(Class<T> type, final String _id, int id){
        List<T> found = find(type, _id+" = ?", String.valueOf(id));
        return !found.isEmpty() ? found.get(0) : null;
    }

    public static <T extends SugarRecord> List<T> listAll(Class<T> type, final String _id, int id){
       return find(type, _id+" = ?", String.valueOf(id));
    }
}

参数final String _id必须是用于执行搜索的变量的序列化名称。建议在自定义类中定义它,如下所示。此外,int id是这种变量的值,在这种情况下是一个自定义ID。
使用扩展了SugarOrm的自定义类允许我重载.listAll方法以及包含自定义方法。此外,我要做的是执行一个不返回单个对象的数据库搜索,以节省内存消耗。然后,通过更改之前定义的doInBackground函数中的函数来实现这一点。
@Override
protected Void doInBackground(Void... params) {
    Offer.checkFor(Offer.class,Offer.ID_OFFER, 0);
    return null;
}

这里我提供了一个从抽象类继承的自定义对象的示例:

public class Offer extends BaseSugarRecord {

    public final static String ID_OFFER = "id_offer";
    @SerializedName(ID_OFFER)
    private int idOffer;
    // ...

1
.last API不可用。我正在使用sugar 1.3。 - Adiyat Mubarak
1
@AdiyatMubarak:他的意思是使用任何方法来触发SugarORM。最好不要使用listAll(),因为它可能会成为一个繁重的操作。 - BlueLeaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接