【问题标题】:How could I detect if particular Activity is displayed currently?如何检测当前是否显示特定活动?
【发布时间】:2013-11-25 18:56:13
【问题描述】:

我有标准的ListView 活动链接到数据库:

dbHelper = new DbAdapter(this);
dbHelper.open();
recordsCursor = dbHelper.fetchAllRecords();
startManagingCursor(recordsCursor);

String[] from = new String[]{DbAdapter.KEY_1, DbAdapter.KEY_2};
int[] to = new int[]{R.id.text1, R.id.background};

adapter = new SimpleCursorAdapter(this, R.layout.row, recordsCursor, from, to);

用户可以选择通过菜单项手动更新列表。它运行任务以从服务器获取更新日期:

new SyncTask(getApplicationContext(), true).execute();

(第二个参数表示这是手动启动同步还是自动启动)

一旦同步完成(onPostExecute),如果仍然显示相同的活动,我想更新列表(fetchAllRecordschangeCursor 等)。如果是这种情况,我怎么理解?

【问题讨论】:

    标签: android android-listview android-asynctask android-activity


    【解决方案1】:

    fragments 不同,您没有任何方法来检查活动生命周期,但添加类似内容很简单:

    private boolean mResumed;
    
    @Override
    protected void onResume() {
        mResumed = true;
    }
    
    @Override
    protected void onPause() {
        mResumed = false;
    }
    
    private void isResumed() {
        return mResumed;
    }
    

    当您的后台任务完成后,只需调用 isResumed() 即可查看 Activity 在屏幕上是否仍然可见。

    【讨论】:

    • 谢谢。不应该是falseonPause吗?主要问题 - 如果用户只是选择菜单项来刷新列表然后等待其完成怎么办? onPauseonResume 在这种情况下不会被调用,所以 mResumed 将是未定义的......
    • 如果您的设备上有活动/可见活动,则始终会调用 onResume。我也更正了您指出的示例中的错误。
    【解决方案2】:

    嗯,我不明白主要问题。

    你之前说过:

    " 如果用户刚刚在菜单项中选择了一个项目来刷新列表然后等待其完成怎么办?"

    如果发生这种情况,您可以像在“onPostExecute”之前所说的那样在任务结束时更新列表视图(没有问题)。

    但在另一种情况下,您可以使用返回您想要的标志的方法来检索活动的状态,或者如果您使用片段,您可以 getActivity() 做某事。每当显示活动时,活动都会执行“恢复”步骤,就像 Philio 之前解释的那样。

    结论,你可以在onResumen中自动更新listview,也可以在syncTask中的onPostExecute中手动更新。该方法会在自动或手动模式下被调用。

    【讨论】:

      猜你喜欢
      • 2017-07-13
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多