【问题标题】:android best approach notifying one activity and anotherandroid通知一个活动和另一个活动的最佳方法
【发布时间】:2023-03-15 08:09:01
【问题描述】:

我只想问我解决以下问题的最佳方法是什么。情况是这样的。

1.) 我有 ActivityA 和 ActivityB。

2.) 用户在 ActivityA 中处理某事(AsyncTask),现在用户在等待时,他去了 ActivityB。

3.) 因此,当用户在 ActivityB 中时,任务在 ActivityA 中成功完成。我将如何通知 ActivityB 任务已经完成 在 ActivityA 中完成?

【问题讨论】:

    标签: android android-activity


    【解决方案1】:

    听起来您可能正在寻找某种事件总线。

    Activity A 的 AsyncTask 完成后将创建一个事件,并且订阅该事件类型的任何人都会收到通知。

    查看奥托:http://square.github.io/otto/

    【讨论】:

    • 同意。虽然我会推荐 EventBus(更快):github.com/greenrobot/EventBus
    • 我很想尝试这个解决方案,但它看起来很先进,但现在,我使用了 LocalBroadcastManager
    【解决方案2】:

    您可以使用LocalBroadcastManager。当 ActivityA 中的 AsyncTask 完成时。 发送一个 ActivityB 可以接收的广播。那么ActivityB就会知道任务已经完成了。

    活动A:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
    
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(ActivityA.this,ActivityB.class));
                new AsyncTask<Void, Void, Void>() {
                    @Override
                    protected Void doInBackground(Void... params) {
    
                        //do some long work
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {
                        }
                        return null;
                    }
    
                    @Override
                    protected void onPostExecute(Void aVoid) {
                        LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(new Intent("ACTION_TASK_DONE"));
                    }
                }.execute();
            }
        });
    
    
    }
    

    活动B:

    private BroadcastReceiver broadcastReceiver;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
    
        broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Toast.makeText(ActivityB.this,"Task done!" , Toast.LENGTH_SHORT).show();
            }
        };
        LocalBroadcastManager.getInstance(getApplicationContext())
                .registerReceiver(broadcastReceiver, new IntentFilter("ACTION_TASK_DONE"));
    
    
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (broadcastReceiver != null) {
            LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(broadcastReceiver);
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用onPostExecute 方法通知用户任务已完成。在你的异步任务中添加给定的方法 -

      protected void onPostExecute(Long result) {
           //notify the user
      }
      

      这个方法会在异步任务完成时被调用。

      【讨论】:

        【解决方案4】:

        在您的帖子中执行 Intent 您从 A 到 B 的活动

        protected void onPostExecute(Long result) {
         Intent intent=new Intent(A.this,B.class);
         startactivities(intent);
        }
        

        或者如果你想在 doinbackground..使用 runonUITheread

        【讨论】:

        • 我认为这段代码有效,假设我想在 actvityA 完成后运行 activityB,但如果我正在运行 AcitivtyB,同时等待 ActivityA,这不起作用。
        【解决方案5】:

        您可以在活动 B 中使用BroadcastReceiver 并从 onPostExecute 调用“sendBroadcast(Intent)”以在活动 B 中通知

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多