簡體   English   中英

Java中的Creator是什么以及如何將其轉換為C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM