Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android,如何将消息发送回主线程_Android_Multithreading - Fatal编程技术网

Android,如何将消息发送回主线程

Android,如何将消息发送回主线程,android,multithreading,Android,Multithreading,实际上我有三个问题 假设我有一个名为CalculateAge()的函数,该函数将由多个用户调用(让我们将其视为提供该函数的简单服务器应用程序),那么我将如何处理用户之间的并发函数调用?(例如,如果用户A和用户B同时调用该函数会发生什么情况 另一个问题是函数(CalculateAge())在一个单独的线程上运行,并且它有一个返回值。那么如何将返回值传递回主线程,以便主线程可以将该值返回给调用该函数的人 最后一个问题是,哪种方式更适合实现此功能?我应该创建一个新线程并在该线程上运行函数,并在新线程完

实际上我有三个问题

假设我有一个名为CalculateAge()的函数,该函数将由多个用户调用(让我们将其视为提供该函数的简单服务器应用程序),那么我将如何处理用户之间的并发函数调用?(例如,如果用户A和用户B同时调用该函数会发生什么情况

另一个问题是函数(CalculateAge())在一个单独的线程上运行,并且它有一个返回值。那么如何将返回值传递回主线程,以便主线程可以将该值返回给调用该函数的人

最后一个问题是,哪种方式更适合实现此功能?我应该创建一个新线程并在该线程上运行函数,并在新线程完成计算后终止该线程?还是应该在应用程序运行期间保持该线程在后台运行


提前感谢。

如果您正在后台线程上工作,您可以使用。但是“函数返回值”的模型在主线程上交付结果是错误的。您需要一个异步架构。最常见的是回调函数
resultAvailable
,可以在后台线程完成其工作后随时调用该函数。该类可以在这方面提供很大帮助

是每次创建一个单独的线程还是保持后台线程运行取决于您需要执行此计算的频率。您可能希望为此使用生产者/消费者模型。在web上有许多关于如何在Java中实现此功能的示例


另一种可能更适合您描述的体系结构是将计算代码设置为服务,然后您可以“调用”它通过使用请求构造意图并接收结果来实现。有关详细信息,请参阅。

您可以通过广播接收器获取值……如下所示,首先创建自己的IntentFilter,如下所示:

Intent intentFilter=new IntentFilter();
intentFilter.addAction("YOUR_INTENT_FILTER");
然后创建内部类BroadcastReceiver作为

    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    /** Receives the broadcast that has been fired */
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction()=="YOUR_INTENT_FILTER"){
           //HERE YOU WILL GET VALUES FROM BROADCAST THROUGH INTENT EDIT YOUR TEXTVIEW///////////
           String receivedValue=intent.getStringExtra("KEY");
        }
    }
};
现在在onResume()中注册广播接收器,如下所示:

最后在onDestroy()中将BroadcastReceiver注销为

现在最重要的部分…你需要从任何你需要发送值的地方发射广播…也可以这样做

Intent i=new Intent();
i.setAction("YOUR_INTENT_FILTER");
i.putExtra("KEY", "YOUR_VALUE");
sendBroadcast(i);

…干杯:)

谢谢你的帮助!我真的很感激!
unregisterReceiver(broadcastReceiver);
Intent i=new Intent();
i.setAction("YOUR_INTENT_FILTER");
i.putExtra("KEY", "YOUR_VALUE");
sendBroadcast(i);