我想强制主布局资源视图重绘/刷新,比如Activity.onResume()方法.我怎样才能做到这一点 ?
通过主布局视图,我的意思是在我的Activity.onCreate()中调用的那个('R.layout.mainscreen'),如下所示: -
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainscreen);
}
Run Code Online (Sandbox Code Playgroud) 我有一个主要的活动A,它使用CursorLoader来查询数据库.这是我在活动onCreate()方法中创建的:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
getSupportLoaderManager().initLoader(LOADER_MEASUREMENTS, null, A.this);
}
Run Code Online (Sandbox Code Playgroud)
Activity A还实现了CursorLoader的3个回调:
public Loader<Cursor> onCreateLoader(int loaderId, Bundle args)
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor)
public void onLoaderReset(Loader<Cursor> loader)
Run Code Online (Sandbox Code Playgroud)
当我旋转设备时,我看到正确的生命周期方法运行:
A.onPause()
A.onStop()
A.onDestroy()
A.onCreate() <-- re-connect to existing loader, onCreateLoader() not called
A.onLoadFinished()
A.onStart()
A.onResume()
Run Code Online (Sandbox Code Playgroud)
然后我打开一个子活动B并旋转我的设备.当我完成B并返回活动AI时,请看以下运行:
B.onPause()
A.onLoaderReset() <- why does this run?
A.onDestroy()
A.onCreate()
A.onCreateLoader() <- now runs as loader is null
A.onStart()
...
Run Code Online (Sandbox Code Playgroud)
为什么我的装载机重置,因为我打开了活动B并且设备旋转了?只是添加活动B与DB或CursorLoader无关.
我正在制作一个新版本的应用程序,其新功能需要 Room DB 中的设置表中包含更多行数据。尽管我的数据库在结构上没有改变(没有新表,没有列更改等),但我正在考虑在 Room DB 上运行新的迁移(DB v2 -> v3),只是为了将这些新数据行添加到现有表中。这太过分了吗?
DB_INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
MyDatabase.class, Constants.DB_NAME)
.addMigrations(new Migration_1_2(context, 1, 2), new Migration_2_3(2, 3))
.build();
Run Code Online (Sandbox Code Playgroud)
我知道我可以在 RoomDatabase 的 onCreate() / onOpen() 回调中添加数据。例如
private static RoomDatabase.Callback rdc = new RoomDatabase.Callback() {
public void onCreate (SupportSQLiteDatabase db) {
// do something after database has been created
}
public void onOpen (SupportSQLiteDatabase db) {
// do something every time database is open
}
};
Run Code Online (Sandbox Code Playgroud)
但我不确定这两个是否合适?
onCreate() - 对于现有应用程序用户,不会调用此方法,因为他们已经拥有上一个应用程序版本的数据库。
onOpen() - 每次启动应用程序时都会运行 - 这看起来开销很大。
至少对于新的迁移来说,这只会为用户运行一次。这是正确的方法吗?
我正在创建一个MP3播放器并想要一个双下一首歌曲/快进按钮.因此,如果按下此按钮,它将继续播放到下一首歌曲,如果按下该按钮,它将快进到当前歌曲.
我可以使用OnClickListener使下一首歌工作...
private OnClickListener mSkipForwardListener = new OnClickListener() {
public void onClick(View v)
{
mPlayerService.forwardASong();
}
};
Run Code Online (Sandbox Code Playgroud)
...但我如何获得快进功能?我尝试过OnLongClickListener,但只触发一次.
private OnLongClickListener mFastForwardListener = new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mPlayerService.fastForward();
return true;
}
};
Run Code Online (Sandbox Code Playgroud)
并且onTouch似乎只在key.down和key.up上触发一次.
private OnTouchListener mFastForwardListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mPlayerService.fastForward();
return true;
}
};
Run Code Online (Sandbox Code Playgroud)
任何帮助,非常感谢,M.
我正在尝试让我的应用程序备份和恢复其数据库文件(例如 mydatabase.db)。备份运行良好 - 它导出单个 .db 文件。它不会导出 -shm / -wal 文件,因为我运行“pragma wal_checkpoint(full)”来刷新主文件的任何更新。恢复似乎运行良好,但之后当我的应用程序查询新复制的数据时,我收到此错误(但应用程序不会崩溃)。
E/ROOM: Invalidation tracker is initialized twice :/.
E/SQLiteLog: (1) no such table: room_table_modification_log
E/ROOM: Cannot run invalidation tracker. Is the db closed?
android.database.sqlite.SQLiteException: no such table: room_table_modification_log
Run Code Online (Sandbox Code Playgroud)
如果我尝试更新任何数据,我会收到这两个错误(现在应用程序确实崩溃了):
java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.
...
E/ROOM: Cannot run invalidation tracker. Is the db closed?
android.database.sqlite.SQLiteException: no such table: room_table_modification_log (code 1 SQLITE_ERROR):
Run Code Online (Sandbox Code Playgroud)
如果我关闭我的应用程序并重新启动它,一切都会正常运行,并且可以毫无错误地查询/更新新数据。我正在使用 Room 2.2.5,并在我拥有的不同设备(Android 6 和 10)上看到此错误。
我的代码如下。我在进行恢复之前关闭数据库,否则应用程序数据库不会更新。
private void dbImport() { …Run Code Online (Sandbox Code Playgroud)