## # Activity跳转太慢 > **提要** > 从一个Activity跳转到另外一个Activity的过程如下创建Intent,执行startActivity(intent)方法,当前Activity的状态由onResume依次转变为onPause->onStop,被启动的Activity的状态依次转变为为onCreate->onStart->onResume。将网络请求函数放到被启动Activity的onCreate函数中,然后只有当onResume函数执行完成之后,安卓的UI界面才会被加载,也就是说在执行onCreateonStartonResume这些函数的过程中,安卓的前端界面始终都是静止状态,这是非常不合理的,也会让用户以为应用崩溃了,用户体验非常的不好。 解决方案一 首先想到的方法就是将数据加载的代码放到一个新的线程中去执行,而在数据加载的过程中,安卓页面会显示加载动画,当resume函数中数据加载完成之后,会将加载动画隐藏,从而提高用户的体验质量。 但是,事实上,在安卓中不允许在子线程中对安卓UI进行操作,也就是说,无法在子线程中来操作加载动画的显示与隐藏。并且需要在每一个页面都要设置加载动画的组件,多用户很友好,但对开发者非常不友好。 为什么要在子线程中执行数据加载的操作呢,因为在数据加载的过程中涉及到对本地数据库的操作,而为防止查询阻止界面,Room 不允许在主线程上访问数据库。 针对这个问题有两种解决方案: 第一个是强制允许在主线程上访问数据库,调用allowMainThreadQueries()方法 ```{lang} # AppDatabase.java import androidx.room.Database; import androidx.room.RoomDatabase; import com.example.app2.Dao.PatientDao; import com.example.app2.Dao.UserDao; import com.example.app2.entity.Patient; import com.example.app2.entity.User; @Database(entities = {User.class, Patient.class}, version = 1 // , autoMigrations = { // @AutoMigration(from = 4, to = 5)} ) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); public abstract PatientDao patientDao(); } # MainActivity.java import androidx.room.Room; // 创建数据库 private void createDatabase() { AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "301_database").allowMainThreadQueries().build(); } ``` 第二个方法就是编写异步DAO查询 详见编写异步 DAO 查询 (opens new window) 在开发过程中,使用Retrofit框架进行http请求操作,刚开始使用的是同步方法结果并且在主线程上执行数据请求的操作,严重影响了主线程中UI的加载与显示,后改为异步方法无论是数据加载还是页面显示或者是Activity跳转都得到了明显的改善。 ## # UI操作经常性失灵 当一个ACtivity中存在了多个线程的时候,在主线程中执行UI操作会受到影响,这个我也不知道该如何解决,所以就尽量避免在主线程中开启新的子线程,尽量使用异步或者是监听器来代替多线程。 Loading... ## # Activity跳转太慢 > **提要** > 从一个Activity跳转到另外一个Activity的过程如下<br/>创建<code>Intent</code>,执行startActivity(intent)方法,当前Activity的状态由<code>onResume</code>依次转变为<code>onPause</code>-><code>onStop</code>,被启动的Activity的状态依次转变为为<code>onCreate</code>-><code>onStart</code>-><code>onResume</code>。将网络请求函数放到被启动Activity的<code>onCreate函数中</code>,然后只有当<code>onResume</code>函数执行完成之后,安卓的UI界面才会被加载,也就是说在执行<code>onCreate</code><code>onStart</code><code>onResume</code>这些函数的过程中,安卓的前端界面始终都是静止状态,这是非常不合理的,也会让用户以为应用崩溃了,用户体验非常的不好。 解决方案一 首先想到的方法就是将数据加载的代码放到一个新的线程中去执行,而在数据加载的过程中,安卓页面会显示加载动画,当resume函数中数据加载完成之后,会将加载动画隐藏,从而提高用户的体验质量。 但是,事实上,在安卓中不允许在子线程中对安卓UI进行操作,也就是说,无法在子线程中来操作加载动画的显示与隐藏。并且需要在每一个页面都要设置加载动画的组件,多用户很友好,但对开发者非常不友好。 为什么要在子线程中执行数据加载的操作呢,因为在数据加载的过程中涉及到对本地数据库的操作,而为防止查询阻止界面,Room 不允许在主线程上访问数据库。 针对这个问题有两种解决方案: 第一个是强制允许在主线程上访问数据库,调用allowMainThreadQueries()方法 ```{lang} # AppDatabase.java import androidx.room.Database; import androidx.room.RoomDatabase; import com.example.app2.Dao.PatientDao; import com.example.app2.Dao.UserDao; import com.example.app2.entity.Patient; import com.example.app2.entity.User; @Database(entities = {User.class, Patient.class}, version = 1 // , autoMigrations = { // @AutoMigration(from = 4, to = 5)} ) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); public abstract PatientDao patientDao(); } # MainActivity.java import androidx.room.Room; // 创建数据库 private void createDatabase() { AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "301_database").allowMainThreadQueries().build(); } ``` 第二个方法就是编写异步DAO查询 详见编写异步 DAO 查询 (opens new window) 在开发过程中,使用Retrofit框架进行http请求操作,刚开始使用的是同步方法结果并且在主线程上执行数据请求的操作,严重影响了主线程中UI的加载与显示,后改为异步方法无论是数据加载还是页面显示或者是Activity跳转都得到了明显的改善。 ## # UI操作经常性失灵 当一个ACtivity中存在了多个线程的时候,在主线程中执行UI操作会受到影响,这个我也不知道该如何解决,所以就尽量避免在主线程中开启新的子线程,尽量使用异步或者是监听器来代替多线程。 最后修改:2025 年 07 月 14 日 © 允许规范转载 赞 别打赏,我怕忍不住购买辣条与续命水