如何使实现IRunnable的类更通用?

时间:2018-01-24 09:35:24

标签: c# android xamarin xamarin.android

我有以下课程:

private class MyRunnable : Java.Lang.Object, Java.Lang.IRunnable
{
    private MainActivity mainActivity;

    public MyRunnable(MainActivity mainActivity)
    {
        this.mainActivity = mainActivity;
    }

    public void Run()
    {

        mainActivity.RunOnUiThread(() =>
        {
            mainActivity.ShowAlert();
        });

    }
}

然后我在OnCreate方法中启动它:

MyRunnable myRunnable = new MyRunnable(this);
Java.Lang.Thread thread = new Java.Lang.Thread(myRunnable);
thread.Start();

但该课程与MainActivityShowAlert方法过于紧密相关。如果我想使用其他活动和其他方法,例如:

private class MyRunnable : Java.Lang.Object, Java.Lang.IRunnable
{
    private (SomeActivity) someActivity;

    public MyRunnable((SomeActivity) someActivity)
    {
        this.someActivity = someActivity;
    }

public void Run()
{

    someActivity.RunOnUiThread(() =>
    {
        mainActivity.(SomeOtherMethod)();
    });

}

}

我无法做到。有没有办法让它更通用? (我正在使用Xamarin.Android)

3 个答案:

答案 0 :(得分:2)

一种简单的方法是创建一个基于Action的runnable,将Action作为参数传递给runnable .actr(你也可以传递额外的params等等)。

Java Runnable中的C#Action

22:11:44 TASK [role-deployment : Executing script] ************
22:11:44 fatal: [x.x.x.x]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Shared connection to x.x.x.x closed.\r\n", "unreachable": true}
22:11:44 
22:11:44 NO MORE HOSTS LEFT *************************************************************
22:11:44  to retry, use: --limit @/opt/ansible/test/deployment.retry
22:11:44 
22:11:44 PLAY RECAP *********************************************************************
22:11:44 x.x.x.x : ok=6    changed=2    unreachable=1    failed=0

用法:

public class MyRunnable : Java.Lang.Object, Java.Lang.IRunnable
{
    readonly WeakReference<Action> actionRef;

    public MyRunnable(Action action)
    {
        actionRef = new WeakReference<Action>(action);
    }

    public void Run()
    {
        actionRef.TryGetTarget(out Action action);
        action?.Invoke();
    }
}

答案 1 :(得分:0)

似乎很容易实现基于接口的方法:

public interface IRunnableActivity
{
    void Run();
}

public class MainActivity : Activity, IRunnableActivity
{
    ...

    public void Run()
    {
        ShowAlert();
    }
}

public class SomeOtherActivity : Activity, IRunnableActivity
{
    ...

    public void Run()
    {
        SomeOtherMethod();
    }
}

private class MyRunnable : Java.Lang.Object, Java.Lang.IRunnable
{
    private IRunnableActivity activity;

    public MyRunnable(IRunnableActivity runnableActivity)
    {
        activity = runnableActivity;
    }

    public void Run()
    {
        runnableActivity.RunOnUiThread(() =>
        {
            runnableActivity.Run();
        });
    }
}

我会让你决定用这种方法决定如何最好地获得RunOnUiThread

答案 2 :(得分:0)

您需要将ShowAlerMainActivity分离,创建一个Utils类,然后添加方法:

class Utils
{
    public static void ShowAlert()
    {
        Android.Util.Log.Error("lv", "=======");
    }
}

MyRunnable类中,使用基类Activity来实现多态性

public class MyRunnable : Java.Lang.Object, Java.Lang.IRunnable
{
    Activity mActivity;

    public MyRunnable(Activity activity)
    {
        mActivity = activity;

    }

    public void Run()
    {
        mActivity.RunOnUiThread(() =>
        {
            Utils.ShowAlert();

        }
       );
    }
}

然后您可以在任何活动中使用底层代码:

Thread thread = new Thread(new MyRunnable(this));
thread.Start();
相关问题