采用 Callable 的 Xamarin Executor
Xamarin Executor that takes Callable
第一部分
您好,我正在尝试更改以下代码以使用 Callable 而不是
可运行,因为我希望将提供给执行程序的功能 return
数据.
using Android.App;
using Android.OS;
using Android.Widget;
using Java.Util.Concurrent;
using Java.Lang;
namespace ServiceExecutor {
[Activity(Label = "SomeActivity")]
public class SomeActivity : Activity {
TextView tv1;
Runnable r;
static IExecutorService exe = Executors.NewSingleThreadExecutor();
protected override void OnCreate(Bundle savedInstanceState) {
base.OnCreate(savedInstanceState);
tv1 = FindViewById<TextView>(Resource.Id.textView1);
for (int i = 0; i < 4; i++) {
r = new Runnable(() => function(i));
exe.Submit(r);
}
}
public void function(int i) {
RunOnUiThread(() => tv1.Text += "function " + i.ToString() + "\r\n");
Thread.Sleep(2000);
}
}
}
我在 Java 中找到了示例,但是当我尝试在 C# 中复制代码时
主要的 class Callable 丢失了,只有 ICallable 我不能
实例化。不幸的是,Xamarin 文档还提供了 Java 个示例!
如果有人能提供帮助,我将不胜感激!
第二部分
完整的设计思想是一个服务,有这个嵌入式执行器到运行
任务顺序。顺序执行是至关重要的,因为服务
将与蓝牙接口有持续的套接字连接,并且只有
一次可以处理一个蓝牙请求(任务)。最初我想使用
IntentService 但我希望服务在
应用程序,否则对于每个蓝牙请求,套接字都必须
重新连接。
对于设计方法的任何建议也将不胜感激!
ICallable
和 IFuture
的 C# 示例 return 与您提供的字符串相同...
实施基于 ICallable
的 class:
在 Call()
方法中执行计算并 return 结果,ExecutorService
负责调用此方法并存储结果。
public class BoomerangeCallable<T> : Java.Lang.Object, ICallable
{
T value;
public BoomerangeCallable(T value)
{
this.value = value;
}
public Java.Lang.Object Call()
{
return value.ToString();
}
}
用法示例:
var futures = new Stack<IFuture>();
var executor = Executors.NewSingleThreadExecutor();
for (int i = 0; i < 5; i++)
{
var br = new BoomerangeCallable<string>("Whosebug");
futures.Push(executor.Submit(br));
}
while (futures.Count > 0)
{
Console.WriteLine(futures.Pop().Get());
}
第一部分
您好,我正在尝试更改以下代码以使用 Callable 而不是 可运行,因为我希望将提供给执行程序的功能 return 数据.
using Android.App;
using Android.OS;
using Android.Widget;
using Java.Util.Concurrent;
using Java.Lang;
namespace ServiceExecutor {
[Activity(Label = "SomeActivity")]
public class SomeActivity : Activity {
TextView tv1;
Runnable r;
static IExecutorService exe = Executors.NewSingleThreadExecutor();
protected override void OnCreate(Bundle savedInstanceState) {
base.OnCreate(savedInstanceState);
tv1 = FindViewById<TextView>(Resource.Id.textView1);
for (int i = 0; i < 4; i++) {
r = new Runnable(() => function(i));
exe.Submit(r);
}
}
public void function(int i) {
RunOnUiThread(() => tv1.Text += "function " + i.ToString() + "\r\n");
Thread.Sleep(2000);
}
}
}
我在 Java 中找到了示例,但是当我尝试在 C# 中复制代码时 主要的 class Callable 丢失了,只有 ICallable 我不能 实例化。不幸的是,Xamarin 文档还提供了 Java 个示例!
如果有人能提供帮助,我将不胜感激!
第二部分
完整的设计思想是一个服务,有这个嵌入式执行器到运行 任务顺序。顺序执行是至关重要的,因为服务 将与蓝牙接口有持续的套接字连接,并且只有 一次可以处理一个蓝牙请求(任务)。最初我想使用 IntentService 但我希望服务在 应用程序,否则对于每个蓝牙请求,套接字都必须 重新连接。
对于设计方法的任何建议也将不胜感激!
ICallable
和 IFuture
的 C# 示例 return 与您提供的字符串相同...
实施基于 ICallable
的 class:
在 Call()
方法中执行计算并 return 结果,ExecutorService
负责调用此方法并存储结果。
public class BoomerangeCallable<T> : Java.Lang.Object, ICallable
{
T value;
public BoomerangeCallable(T value)
{
this.value = value;
}
public Java.Lang.Object Call()
{
return value.ToString();
}
}
用法示例:
var futures = new Stack<IFuture>();
var executor = Executors.NewSingleThreadExecutor();
for (int i = 0; i < 5; i++)
{
var br = new BoomerangeCallable<string>("Whosebug");
futures.Push(executor.Submit(br));
}
while (futures.Count > 0)
{
Console.WriteLine(futures.Pop().Get());
}