【问题标题】:How to get temporary disabled preferences in AsyncTask?如何在 AsyncTask 中获得临时禁用的首选项?
【发布时间】:2018-07-03 15:23:24
【问题描述】:

我正在构建一个在设置活动中具有首选项的应用程序。有两组首选项,一组用于应用程序设置,另一组用于用户设置,应与远程网络服务器同步。

一个首选项表示为一个按钮,它正在运行AsyncTask 发送数据到后端:

<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/save_btn"
    android:layout_width="fill_parent"
    android:layout_height="80dp"
    android:layout_marginBottom="10dp"
    android:layout_marginTop="10dp"
    android:enabled="true"
    android:text="Save Settings" />

我想在 AsyncTask 运行时部分禁用首选项,并重新启用它们进行编辑,当异步任务完成时,我该怎么做?

我的想法是在异步任务中获取活动上下文,这是正确的方法吗?

public class SavePreferences extends Preference {


    // constructor code is skipped

    @Override
    protected void onBindView(View view) {
        super.onBindView(view);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                (new UpdateFilterTask(v)).execute();
            }
        });
    }

}

和AsyncTask的构造函数:

public UpdateFilterTask(View btn) {
    super();
    this.button = btn;
    rootView = btn.getRootView();
    ...
}

【问题讨论】:

  • 你可以设置一个static boolean Busy,如果不忙,OnClick 将它设置为true 并禁用按钮(用于样式目的),在OnPostExcute 中将忙设置为false。所以当用户再次点击时,检查 Busy 是否为真,然后返回或重复..
  • 所以基本上你希望你的save buttonAsyncTask 运行时被禁用?
  • 保存按钮与过滤器设置相关的其他首选项 - 我想限制用户在更新时修改设置。与应用设置相关的其他设置应该是可编辑的

标签: android


【解决方案1】:

在这种情况下您可以采取多种方法

  1. 在 AsyncTask 的 postExecute() 回调中使用 LocalBroadcastManager 发送广播

    LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent(ACTION_NAME));

在您的 Activity 中注册接收器,以便在 AsyncTask 使用 doInBackground() 完成后得到通知。

BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                // **enable the preferences here**

            }
        };
LocalBroadcastManager.getInstance(this).registerReceiver(receiver, new IntentFilter(ACTION_NAME));

注意:注册接收器时和从 AsyncTask 广播时的 ACTION_NAME 应该相同

  1. 您还可以在您的AsyncTask 类 中定义一个接口,并在您的Activity 类中实现它。从 Activity 传递引用启动 AsyncTask,然后在 AsyncTask 类中,您可以将其类型转换为 Interface 对象。最后,使用相同的接口对象,您可以在 postExecute() 回调中调用其方法(在 Activity 中定义)。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多