Xamarin Executor, который принимает Callable
Часть I
Привет, я пытаюсь изменить следующий фрагмент кода, чтобы использовать 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!
Буду признателен, если кто-нибудь сможет помочь!
Часть II
Идея полного проекта - это Сервис, в который встроен этот Исполнитель для последовательного выполнения задач. Последовательное выполнение является критическим, потому что служба будет иметь постоянное сокетное соединение с интерфейсом Bluetooth, и одновременно может обрабатываться только один запрос (задача) Bluetooth. Первоначально я хотел использовать IntentService, но я хочу, чтобы служба работала в течение всего жизненного цикла приложения, в противном случае при каждом запросе bluetooth сокету придется повторно подключаться.
Любые советы по подходу к дизайну также будут оценены!
1 ответ
C# пример ICallable
а также IFuture
это просто возвращает ту же строку, что вы предоставили...
Реализовать 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>("Stackru");
futures.Push(executor.Submit(br));
}
while (futures.Count > 0)
{
Console.WriteLine(futures.Pop().Get());
}