我有以下课程:
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();
但该课程与MainActivity
和ShowAlert
方法过于紧密相关。如果我想使用其他活动和其他方法,例如:
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)
答案 0 :(得分:2)
一种简单的方法是创建一个基于Action的runnable,将Action作为参数传递给runnable .actr(你也可以传递额外的params等等)。
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)
您需要将ShowAler
与MainActivity
分离,创建一个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();