[英]What is Creator in Java and how to Translate it to C#
我正在將代碼從Java轉換為C#/ Xamarin,但是我無法理解下面提到的代碼
public static class GraphicPath implements Parcelable
{
protected GraphicPath(Parcel par)
{
int size=in.readInt();
int[] x=new int[size];
int[] y=new int[size];
in.readIntArray(x);
in.readIntArray(y);
pathX=new ArrayList<>();
pathY=new ArrayList<>();
for (int i=0;i<x.length;i++){
pathX.add(x[i]);
}
for (int i=0;i<y.length;i++){
pathY.add(y[i]);
}
}
//Unable to understand and translate the below code.
public static final Creator<GraphicPath> CREATOR = new Creator<GraphicPath>() {
@Override
public GraphicPath createFromParcel(Parcel in) {
return new GraphicPath(in);
}
@Override
public GraphicPath[] newArray(int size) {
return new GraphicPath[size];
}
};
}
它是什么,如何將其轉換為C#,以及如何將Java處理程序代碼轉換為C#? 處理程序是線程嗎? 如何將以下處理程序轉換為C#
Handler handler = new Handler(Looper.getMainLooper());
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
startCapture();
}
},1000);
handler.post(new Runnable() {
@Override
public void run() {
toCapture();
}
});
return;
轉換后的C#代碼給出了錯誤,該C#代碼實現了IParcelable接口,並且其中沒有Creator。
public class GraphicPath : IParcelable
{
protected GraphicPath(Parcel par)
{
int size =par.ReadInt();
int[] x = new int[size];
int[] y = new int[size];
par.ReadIntArray(x);
par.ReadIntArray(y);
pathX = new List<int>();
pathY = new List<int>();
for (int i = 0; i < x.Length; i++)
{
pathX.Add(x[i]);
}
for (int i = 0; i < y.Length; i++)
{
pathY.Add(y[i]);
}
}
//Red lines here
public static Creator<GraphicPath> CREATOR = new Creator<GraphicPath>() {
//paste here
};
}
Creator用於Parcelable,Parcelable用於類的序列化,以通過Intent在活動之間傳遞它們,因此您必須遵循此文檔https://developer.xamarin.com/api/type/Android.OS.Parcelable/ how在Xamarin中使用它們
public class MyParcelable implements Parcelable {
private int mData;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
}
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
private MyParcelable(Parcel in) {
mData = in.readInt();
}
}
對於處理程序,您還必須查看此文檔https://developer.xamarin.com/api/type/Android.OS.Handler/
我已經在ViewPagerIndicator
端口中完成了此ViewPagerIndicator
以保存狀態: https : //github.com/Cheesebaron/ViewPagerIndicator/blob/master/Library/CirclePageIndicator.cs#L535
因此,要創建自己的創作者,您可以執行以下操作:
public class GraphicPathCreator : Java.Lang.Object, IParacleableCreator
{
public Java.Lang.Object CreateFromParcel(Parcel source)
{
return new GraphicPath(source);
}
public Java.Lang.Object[] NewArray(int size)
{
return new GraphicPath[size];
}
}
然后,您可以像下面這樣定義CREATOR
:
[ExportField("CREATOR")]
public static GraphicPathCreator Creator()
{
return new GraphicPathCreator();
}
這里的ExportField
很重要。 它在Android Callable Wrappers中將您的方法公開為CREATOR
。
要將其與您的GrapicPath
結合使用,它將類似於:
public static class GraphicPath : BaseSavedState
{
public List<int> PathX { get; private set; }
public List<int> PathY { get; private set; }
public GraphicPath(IParcelable superState)
: base(superState)
{
}
public GraphicPath(Parcel parcel) : base(parcel)
{
var size = parcel.ReadInt();
int[] x = new int[size];
int[] y = new int[size];
parcel.ReadIntArray(x);
parcel.ReadIntArray(y);
PathX = new List<int>(x);
PathY = new List<int>(y);
}
public override void WriteToParcel(Parcel dest, ParcelableWriteFlags flags)
{
base.WriteToParcel(dest, flags);
dest.WriteInt(PathX.Count);
dest.WriteIntArray(PathX.ToArray());
dest.WriteIntArray(PathY.ToArray());
}
// creator stuff here
對於Handlers
有兩種解決方法。 您可以將它們轉換為C#任務,也可以保持原樣,僅將它們翻譯為1:1。
對於1:1轉換,它們看起來像:
var handler = new Handler(Looper.MainLooper);
handler.PostDelayed(() => StartCapture(), 1000);
handler.Post(() => ToCapture());
Lambda只是Action
匿名實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.