采用Callable的Xamarin Executor

时间:2017-01-19 08:32:35

标签: c# android xamarin callable executor

第一部分

嗨,我正在尝试更改以下代码以取代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但我希望服务在整个生命周期中都是活着的 应用程序,否则对于套接字必须的每个蓝牙请求 重新连接。

对于设计方法的任何建议也将不胜感激!

1 个答案:

答案 0 :(得分:1)

ICallableIFuture的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());
}