代码之家  ›  专栏  ›  技术社区  ›  Ilja

如何在asynctask中获取临时禁用的首选项?

  •  0
  • Ilja  · 技术社区  · 6 年前

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

    一个首选项表示为一个按钮,它运行 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" />
    

    我想在async task运行时部分禁用首选项,并重新启用它们进行编辑,当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();
                }
            });
        }
    
    }
    

    异步任务的构造函数:

    public UpdateFilterTask(View btn) {
        super();
        this.button = btn;
        rootView = btn.getRootView();
        ...
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Mayank Bhatnagar    6 年前

    在这种情况下,可以采用多种方法

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

      localbroadcastmanager.getInstance(context).sendBroadcast(new intent(action_name));

    在活动中注册接收器,以便在使用doinbackground()完成asynctask后获得通知。

    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广播时,操作名称应该相同

    1. 您还可以定义 接口 在你的 异步任务类 并在活动类中实现它。从传递引用的活动启动asynctask,然后在asynctask类中,可以将其类型转换为接口对象。最后,使用相同的接口对象,可以在postExecute()回调函数中调用其方法(在活动中定义)。

    希望有帮助。