📜  如何在 android 中无意图地刷新活动 - Java (1)

📅  最后修改于: 2023-12-03 15:08:33.191000             🧑  作者: Mango

如何在 Android 中无意图地刷新活动

Android 中的活动是应用程序的核心组件,它是用户与应用程序进行交互的主要方式。在某些情况下,您可能希望在当前活动中无意图地刷新数据,例如在网络请求完成后更新UI。本文将介绍一些在 Android 应用程序中无意图地刷新活动的方法。

方法一:使用 Handler

Handler 是 Android 中的一个基础类,它用于在不同的线程之间发送消息和执行代码块。通过使用 Handler,您可以在主线程中更新UI,并避免在非主线程上更新UI时出现非法状态异常(illegal state exception)。

以下是使用 Handler 在主线程中无意图地刷新活动的示例代码:

private Handler mHandler = new Handler();

private Runnable mRefreshRunnable = new Runnable() {
    @Override
    public void run() {
        // 在此处进行数据刷新操作
        mHandler.postDelayed(this, 1000); // 每隔1秒刷新一次
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 启动更新任务
    mHandler.post(mRefreshRunnable);
}

@Override
protected void onDestroy() {
    super.onDestroy();

    // 停止更新任务
    mHandler.removeCallbacks(mRefreshRunnable);
}

在这个示例代码中,我们创建了一个 Handler 对象和一个 Runnable 对象。我们在活动的 onCreate() 方法中启动了我们的更新任务,该任务每隔1秒刷新一次 UI。在活动的 onDestroy() 方法中,我们停止了该任务,以便在活动被销毁时停止刷新操作。

方法二:使用 View.post(Runnable)

在 View 类中,post(Runnable) 方法用于在主线程中排队一个 Runnable,该 Runnable 将在下一次绘制遍历时(draw traversal)执行。这意味着您可以使用 View.post(Runnable) 方法来在主线程中无意图地更新 UI。

以下是使用 View.post(Runnable) 在主线程中无意图地刷新活动的示例代码:

private Runnable mRefreshRunnable = new Runnable() {
    @Override
    public void run() {
        // 在此处进行数据刷新操作
        mView.postDelayed(this, 1000); // 每隔1秒刷新一次
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 启动更新任务
    mView.post(mRefreshRunnable);
}

@Override
protected void onDestroy() {
    super.onDestroy();

    // 停止更新任务
    mView.removeCallbacks(mRefreshRunnable);
}

在这个示例代码中,我们创建了一个 Runnable 对象,然后使用 View.post(Runnable) 方法将其排队到主线程的消息队列中。当活动被销毁时,我们从消息队列中删除此 Runnable 对象,以停止刷新操作。

方法三:使用 LiveData

LiveData 是 Android 架构组件库中的一个类,它使得从 ViewModel 到用户界面(UI)的数据流更加容易。通过使用 LiveData,您可以轻松地无意图地刷新活动,并且只有在数据发生变化时才会刷新。

以下是使用 LiveData 在主线程中无意图地刷新活动的示例代码:

public class MainViewModel extends ViewModel {
    private MutableLiveData<String> mData = new MutableLiveData<>();

    public LiveData<String> getData() {
        return mData;
    }

    public void refreshData() {
        // 在此处进行数据刷新操作
        mData.postValue("new data"); // 将 LiveData 的值设为新数据
    }
}

public class MainActivity extends AppCompatActivity {
    private MainViewModel mViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化 ViewModel
        mViewModel = ViewModelProviders.of(this).get(MainViewModel.class);

        // 观察 LiveData,并在数据发生变化时刷新 UI
        mViewModel.getData().observe(this, new Observer<String>() {
            @Override
            public void onChanged(String newData) {
                updateUI(newData);
            }
        });

        // 启动更新任务
        mViewModel.refreshData();
    }

    private void updateUI(String newData) {
        // 在此处更新 UI
    }
}

在这个示例代码中,我们创建了一个 MainViewModel 类,该类包含一个 MutableLiveData 对象,用于存储数据。我们还为该类创建了一个 refreshData() 方法,该方法用于进行数据刷新操作,并使用 LiveData 的 postValue() 方法将新数据发送到 LiveData 的观察者(observer)中。

在 MainActivity 类中,我们使用 ViewModelProviders.of(this).get(MainViewModel.class) 初始化了 MainViewModel 对象。我们还使用 LiveData 的 observe() 方法来观察数据变化,并在变化时调用 updateUI() 方法更新 UI。最后,我们在启动时调用了 refreshData() 方法,以便进行数据刷新操作。

以上是 Android 应用程序中无意图地刷新活动的三种方法,您可以根据您的应用程序需求选择使用。无论您选择哪种方法,都应该遵循单一职责原则(SRP)并将刷新操作隔离在一个独立的类或方法中。