如何通过线程更新非 MainActivity 活动?

Posted

技术标签:

【中文标题】如何通过线程更新非 MainActivity 活动?【英文标题】:How can I update an not MainActivity Activity via a Thread? 【发布时间】:2019-11-01 20:42:40 【问题描述】:

我想更新一个不是 MainActivity 的 Activity。

所以我通过 MainActivity 中的 onClick 方法启动了第二个 Activity。

现在活动“SecondActivity”在前面。 当我在“MainActivity”中启动一个线程时,如何引用“SecondActivity”来更新他们的 TextViews 等等?

伪代码

 public class activity_MainActivity extends AppCompatActivity 
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ThreadSome threadSome= new ThreadSome();
        threadSome.start()
    
   
   onClick(View View)

   Intent intent = new Intent(this, activity_Second.class);
   startActivity(intent);
   

内线


public class ThreadSome extends Thread 

    @Override
    public void run() 
      //This is what I don't know, so I just write what I want to do.
      // I know the following Code is wrong and not working.

      activity_Second.someTextView.setText("Hi");
    

WeakReference 是最好的方法,还是更好地使用静态 TextView 对象?你会如何解决这个问题?

【问题讨论】:

second activity 在运行时是什么意思,您只有一个活动来更新 ui 。其他活动可能永远不会创建或处于暂停/停止状态。所以没有要更新的ui。您可以在需要启动时通过意图将数据传递给它 我不明白。我制作了一个弹出窗口并将其创建为一个活动。只有一个 Activity 正在运行,但它不是我认为的 MainActivitiy 还是我完全错了? 最好阅读android生命周期以避免这种混乱和浪费你和其他人的时间 这对我没有帮助。我读到了这个,但我的问题没有任何显示。当我通过一个意图启动一项活动时,这是唯一一个正在运行的活动。但是我该如何改变让我们在这个活动中说一个 TextView? 如果您能更详细地解释您需要做什么,也许会有所帮助。具体有哪些变化? Activity 之间的通信可以通过 Intent 进行,方法是传递在创建新 Activity 时解绑的数据包,甚至使用接口/回调方法。在我看来,如果您使用 startActivityForResult 并从结果意图中获取重要数据,您也可以做您想做的事情。尝试更具体地说明您的问题,我相信您会找到很多选择,而不必费心处理线程。 【参考方案1】:

根据您的描述,我认为您想做一些事情,根据前台活动中执行的某些事件,活动堆栈中会有一些 ui 更改。有一种通过 startActivityForResult() 使用 onActivityResult() 的好方法,但如果这不能直接满足您的要求,那么您可以尝试以下方法:

/**
    UpdateActivity is the activity where some ui update or action will be taken based on event in EventActivity.
**/

public class UpdateActivity extends Activity 

    private BroadcastReceiver mReceiver;
    public static final String ACTION_UPDATE = "com.my.internal.activity.action";

    ...

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_update);

        ......

        //Prepared Intent for broadcast receiver
        IntentFilter intentFilter = new IntentFilter(ACTION_UPDATE);
        //registering our receiver
        this.registerReceiver(mReceiver, intentFilter);

        .....
    

    //This is the receiver section where you need to do the ui update
    mReceiver = new BroadcastReceiver() 

        @Override
        public void onReceive(Context context, Intent intent) 
            //extract our message from intent
            String some_msg = intent.getStringExtra("msg_1"); //parameter received if passed in intent when broadcast called.
            //log our message value
            Log.i("Message", some_msg);

            updateActivityUi();
        
    ;

    private void updateActivityUi() 
        // you need to write the code for the update which you want to do after an event done in other activity.
    

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

        //unregister our receiver
        this.unregisterReceiver(this.mReceiver);
    


public class EventActivity extends Activity 

    ...

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event);

        ......

        //Sending BroadcastReceiver against the action ACTION_UPDATE and it will be received by UpdateActivity.
        if(condition_for_event) 
            Intent i = new Intent(UpdateActivity.ACTION_UPDATE).putExtra("msg_1", "Hey! an event performed here.");
            this.sendBroadcast(i);
        

        .....
    

    ....

如果它解决了您的问题,请告诉我。

【讨论】:

这是我正在寻找的,但不是在两个活动之间,只是在一个线程和第二个活动之间。感谢您密切关注我的问题,而不仅仅是投反对票。

以上是关于如何通过线程更新非 MainActivity 活动?的主要内容,如果未能解决你的问题,请参考以下文章

从 Asynctask 更新 MainActivity 上的 ListView

重新创建活动时如何从 AsyncTask 更新 TextView

通过界面更新/设置文本

如何在不重新启动活动的情况下更新 recyclerview(来自 sqlite 的数据)

如何使主活动线程影响第二个活动

通过片段获取父活动