小编Mic*_*eyR的帖子

如何强制整个布局查看刷新?

我想强制主布局资源视图重绘/刷新,比如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)

layout android refresh

167
推荐指数
8
解决办法
36万
查看次数

为什么在设备轮换后调用CursorLoader onLoaderReset()?

我有一个主要的活动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无关.

android loader reset

11
推荐指数
1
解决办法
1395
查看次数

迁移以将新数据行插入 Room DB

我正在制作一个新版本的应用程序,其新功能需要 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() - 每次启动应用程序时都会运行 - 这看起来开销很大。

至少对于新的迁移来说,这只会为用户运行一次。这是正确的方法吗?

database migration android android-room

5
推荐指数
1
解决办法
2151
查看次数

如何使用双短按连续按钮实现按钮?

我正在创建一个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.

android onclick button ontouchlistener

4
推荐指数
1
解决办法
3460
查看次数

房间数据库文件导入错误(“没有这样的表:room_table_modification_log”)

我正在尝试让我的应用程序备份和恢复其数据库文件(例如 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)

database sqlite import android android-room

2
推荐指数
1
解决办法
1108
查看次数