第一部分
嗨,我正在尝试更改以下代码,以使用Callable而不是可运行,因为我希望提供给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() + "rn");
Thread.Sleep(2000);
}
}
}
我在Java中找到了一些例子,但当我试图用C语言复制代码时#主类Callable不见了,只有我不能的ICallable实例化。不幸的是,Xamarin文档也给出了Java示例!
如果有人能帮忙,我将不胜感激!
第二部分
完整的设计思想是一个服务,它有这个嵌入式执行器来运行任务顺序。顺序执行是至关重要的,因为服务将具有与蓝牙接口的连续套接字连接,并且仅一次可以处理一个蓝牙请求(任务)。最初我想使用IntentService,但我希望该服务在应用程序,否则对于每个蓝牙请求,套接字必须重新连接。
任何关于设计方法的建议也将不胜感激!
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());
}