第一部分
嗨,我正在尝试更改以下代码以取代Callable Runnable,因为我想要提供给Executor的函数返回 数据
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#中复制代码时 缺少主要类Callable,只有ICallable,我不能 实例。不幸的是,Xamarin文档也提供了Java示例!
如果有人能提供帮助,我将不胜感激!
第二部分
完整的设计理念是具有此嵌入式Executor的Service 任务顺序。由于服务,顺序执行是残酷的 将只与蓝牙接口连续套接字连接 一次可以处理一个蓝牙请求(任务)。最初我想用 IntentService但我希望服务在整个生命周期中都是活着的 应用程序,否则对于套接字必须的每个蓝牙请求 重新连接。
对于设计方法的任何建议也将不胜感激!
答案 0 :(得分:1)
ICallable
和IFuture
的C#示例,只返回您提供的相同字符串...
ICallable
的课程:在Call()
方法中,您实现计算并返回结果,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>("StackOverflow");
futures.Push(executor.Submit(br));
}
while (futures.Count > 0)
{
Console.WriteLine(futures.Pop().Get());
}