簡體   English   中英

使用SharedPreferences保存抽象類的子類的ArrayList

[英]Using SharedPreferences to save an ArrayList of Subclasses of an Abstract Class

大家下午好,我是一名大學生,我決定制作一款趣味游戲,直到現在為止一切都很好,因為我遇到了一個我聽不懂的“ bug”:

我有一個名為“ UpgradesClick”的抽象類,其中包含所有的Click Upgrades,如下所示: 抽象類樹

我的抽象類“UpgradesClick”實現Parcelable(我試圖使其通過Intent.PutExtra並沒有奏效) 抽象類

然后我以為SharedPreferences可以救我,因為我已經聽說過它們,並且我希望我的Upgrade Click商店活動執行save()onPause() 方法調用,以保存所有對象的值,Level和Price,這樣我決定制作一個抽象類UpgradeClick及其所有內容的ArrayList。 將對象添加到ArrayList

然后,我編寫了典型的SharedPreferences調用Save()和Load(),每當我從MainActivity移到商店時,它都會顯示數據已加載(1)*,但是當我移回MainActivity時,游戲崩潰了,並且將我所有的值都設置回0(2)* --*請參閱此處

這是我的問題,在我無法理解的onSave()方法上出現錯誤,因為它沒有對任何內容加下划線。 Save()和Load()方法

它在“ json = gson.toJson(todosUpgradesClick);”上給我一個錯誤。 我假設將ArrayList轉換為Json文件。

遺憾的是,“將對象發送到其他活動”不允許我繼續游戲,因為大多數游戲代碼只是在我的onClick方法上添加每個類的值並乘以其他值。
也很抱歉沒有在帖子中發布任何代碼,但是它是如此之大,以至於沒有人會不願意閱讀。 非常感謝您,時間寶貴的堆棧溢出器;)


PS:如果您想知道“列表”,我首先將它設為ArrayList,但是它沒有用,因此屏幕截圖中顯示“列表”的部分也嘗試作為ArrayList。
再次感謝您的時間和耐心。

編輯-添加了代碼和錯誤日志

碼:

> 
import android.app.Activity;
import android.os.Parcel;
import android.os.Parcelable;
import android.widget.TextView;

public abstract class UpgradesClick extends MainActivity implements Parcelable {
    private int nivel;
    private int preco;
    private int precoBase;
    private int valorGanhoPorClick;
    Activity act;

    //private TextView tvQtdPClick;
    private TextView tvnivel;
    private TextView tvpreco;

    protected UpgradesClick(Activity act, int nivel, int precoBase){
        //setTvQtdPClick( (TextView) act.findViewById(R.id.qtdcuspopc) );
        this.nivel = nivel;
        this.precoBase = precoBase;
        this.act = act;
    }
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(nivel);
        out.writeInt(preco);
    }
    protected UpgradesClick(Parcel in) {
        nivel = in.readInt();
        preco = in.readInt();
    }
    public void comprarUpgrade(){
        setNivel( getNivel() + 1 );
        setPreco( getNivel() * 5 );
        setValorGanhoPorClick( getNivel() );
    }
    public float getValorGanhoPorClick() {
        return valorGanhoPorClick;
    }
    public void setValorGanhoPorClick(int valorGanhoPorClick) {
        this.valorGanhoPorClick = valorGanhoPorClick;
    }
    public int getPrecoBase() {
        return precoBase;
    }
    public void setPrecoBase(int precoBase) {
        this.precoBase = precoBase;
    }
    public void setPreco(int preco) {
        this.preco = preco;
    }
    public int getPreco(){
        if (getNivel() == 0){
            return precoBase;
        }else {
            return preco;
        }
    }
    public int getNivel() {
        return nivel;
    }
    public void setNivel(int nivel) {
        this.nivel = nivel;
    }
    public void setTvnivel(TextView tvnivel) {
        this.tvnivel = tvnivel;
    }
    public TextView getTvnivel() {
        return tvnivel;
    }
    public void setTvpreco(TextView tvpreco) {
        this.tvpreco = tvpreco;
    }
    public TextView getTvpreco() {
        return tvpreco;
    }
}
class UpgradeClick_Gosma extends UpgradesClick{

    public UpgradeClick_Gosma(Activity act, int nivel, int precoBase) {

        super(act, nivel, precoBase);
        setValorGanhoPorClick(getNivel());
        setPreco(getPrecoBase() * getNivel());
    }

    public static final Parcelable.Creator<UpgradeClick_Gosma> CREATOR = new Parcelable.Creator<UpgradeClick_Gosma>() {
        public UpgradeClick_Gosma createFromParcel(Parcel in) {
            return new UpgradeClick_Gosma(in);
        }

        @Override
        public UpgradeClick_Gosma[] newArray(int size) {
            return new UpgradeClick_Gosma[size];
        }
    };

    public UpgradeClick_Gosma(Parcel in) {
        super(in);
    }

    @Override
    public int describeContents() {
        return 0;
    }
}
class UpgradeClick_Dedeta extends UpgradesClick{

    public UpgradeClick_Dedeta(Activity act, int nivel, int precoBase) {

        super(act, nivel, precoBase);
        setValorGanhoPorClick(getNivel());
        setPreco(getPrecoBase() * getNivel());
    }

    public static final Parcelable.Creator<UpgradeClick_Dedeta> CREATOR = new Parcelable.Creator<UpgradeClick_Dedeta>() {
        public UpgradeClick_Dedeta createFromParcel(Parcel in) {
            return new UpgradeClick_Dedeta(in);
        }

        @Override
        public UpgradeClick_Dedeta[] newArray(int size) {
            return new UpgradeClick_Dedeta[size];
        }
    };

    public UpgradeClick_Dedeta(Parcel in) {
        super(in);
    }

    @Override
    public int describeContents() {
        return 0;
    }
}
class UpgradeClick_Sorte extends UpgradesClick{

    public UpgradeClick_Sorte(Activity act, int nivel, int precoBase) {

        super(act, nivel, precoBase);
        setValorGanhoPorClick(getNivel());
        setPreco(getPrecoBase() * getNivel());
    }

    public static final Parcelable.Creator<UpgradeClick_Sorte> CREATOR = new Parcelable.Creator<UpgradeClick_Sorte>() {
        public UpgradeClick_Sorte createFromParcel(Parcel in) {
            return new UpgradeClick_Sorte(in);
        }

        @Override
        public UpgradeClick_Sorte[] newArray(int size) {
            return new UpgradeClick_Sorte[size];
        }
    };

    public UpgradeClick_Sorte(Parcel in) {
        super(in);
    }

    @Override
    public int describeContents() {
        return 0;
    }
}
class UpgradeClick_Douro extends UpgradesClick{

    public UpgradeClick_Douro(Activity act, int nivel, int precoBase) {

        super(act, nivel, precoBase);
        setValorGanhoPorClick(getNivel());
        setPreco(getPrecoBase() * getNivel());
    }

    public static final Parcelable.Creator<UpgradeClick_Douro> CREATOR = new Parcelable.Creator<UpgradeClick_Douro>() {
        public UpgradeClick_Douro createFromParcel(Parcel in) {
            return new UpgradeClick_Douro(in);
        }

        @Override
        public UpgradeClick_Douro[] newArray(int size) {
            return new UpgradeClick_Douro[size];
        }
    };

    public UpgradeClick_Douro(Parcel in) {
        super(in);
    }

    @Override
    public int describeContents() {
        return 0;
    }
}
class UpgradeClick_Agua extends UpgradesClick{

    public UpgradeClick_Agua(Activity act, int nivel, int precoBase) {

        super(act, nivel, precoBase);
        setValorGanhoPorClick(getNivel());
        setPreco(getPrecoBase() * getNivel());
    }

    public static final Parcelable.Creator<UpgradeClick_Agua> CREATOR = new Parcelable.Creator<UpgradeClick_Agua>() {
        public UpgradeClick_Agua createFromParcel(Parcel in) {
            return new UpgradeClick_Agua(in);
        }

        @Override
        public UpgradeClick_Agua[] newArray(int size) {
            return new UpgradeClick_Agua[size];
        }
    };

    public UpgradeClick_Agua(Parcel in) {
        super(in);
    }

    @Override
    public int describeContents() {
        return 0;
    }
}

-商店活動代碼

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.*;
import java.util.ArrayList;
import java.util.List;

public class UpgradeClickActvity extends AppCompatActivity {
    //UpgradesClick.UpgradeClick1 upgrade;

    Intent intent;

    int[] IMAGEM = {R.drawable.upgradespit1, R.drawable.upgradespit2, R.drawable.upgradespit3, R.drawable.upgradespit4, R.drawable.upgradespit5};
    int[] NOME = {R.string.UpgradeClick1Titulo, R.string.UpgradeClick2Titulo, R.string.UpgradeClick3Titulo, R.string.UpgradeClick4Titulo, R.string.UpgradeClick5Titulo};
    int[] DESCRICAO = {R.string.UpgradeClick1Descricao, R.string.UpgradeClick2Descricao, R.string.UpgradeClick3Descricao, R.string.UpgradeClick4Descricao, R.string.UpgradeClick5Descricao};


    UpgradeClick_Gosma upgradeclickgosma;
    UpgradeClick_Dedeta upgradeclickdedeta;
    UpgradeClick_Sorte upgradeclicksorte;
    UpgradeClick_Douro upgradeclickdouro;
    UpgradeClick_Agua upgradeclickagua;

    List<UpgradesClick> todosUpgradesClick;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.upgrades_click);
        todosUpgradesClick = new ArrayList<>();

        loadData();

        Intent intent = getIntent();
        Cuspo cuspo = (Cuspo) intent.getParcelableExtra("objCuspo");
        TextView textoQtdCuspo = (TextView)findViewById(R.id.lojaQtdCuspo);
        textoQtdCuspo.setText(String.valueOf(cuspo.getQtd()));
        TextView textoQtdCuspoUni = (TextView)findViewById(R.id.lojaQtdCuspoUni);
        textoQtdCuspoUni.setText(String.valueOf(cuspo.getQtdUni()));


        upgradeclickgosma = new UpgradeClick_Gosma(this, 0, 20);
        upgradeclickdedeta = new UpgradeClick_Dedeta(this, 0, 100);
        upgradeclicksorte = new UpgradeClick_Sorte(this, 0, 500);
        upgradeclickdouro = new UpgradeClick_Douro(this, 0, 1000);
        upgradeclickagua = new UpgradeClick_Agua(this, 0, 5000);

        todosUpgradesClick.add(upgradeclickgosma);
        todosUpgradesClick.add(upgradeclickdedeta);
        todosUpgradesClick.add(upgradeclicksorte);
        todosUpgradesClick.add(upgradeclickdouro);
        todosUpgradesClick.add(upgradeclickagua);


        ListView listView = (ListView)findViewById(R.id.listviewupgclick);
        CustomAdapter customAdapter = new CustomAdapter();
        listView.setAdapter(customAdapter);
        ImageView btnBack = (ImageView)findViewById(R.id.btnback) ;
        btnBack.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(UpgradeClickActvity.this, MainActivity.class);
                intent.putExtra("upggosma", upgradeclickgosma);
                //intent.putExtra("upgdedeta", upgradeclickdedeta);
                startActivity(intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
            }
        });
    }

    @Override
    protected void onPause() {
        super.onPause();
        saveData();
        //intent = new Intent(UpgradeClickActvity.this, MainActivity.class);
        Toast.makeText(UpgradeClickActvity.this, "Data saved" ,Toast.LENGTH_LONG).show();
    }

    class CustomAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            return IMAGEM.length;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View view, ViewGroup parent) {
            view = getLayoutInflater().inflate(R.layout.upgradestemplate, null);

            ImageView imageView = (ImageView)view.findViewById(R.id.template_imagem);
            TextView textView_name = (TextView)view.findViewById(R.id.template_titulo);
            TextView textView_descricao = (TextView)view.findViewById(R.id.template_descricao);
            TextView textView_preco = (TextView)view.findViewById(R.id.template_preco);
            TextView textView_nivel = (TextView)view.findViewById(R.id.template_nivel);

            imageView.setImageResource(IMAGEM[position]);
            textView_name.setText(NOME[position]);
            textView_descricao.setText(DESCRICAO[position]);
            textView_preco.setText(String.valueOf(todosUpgradesClick.get(position).getPreco()));
            textView_nivel.setText(String.valueOf(todosUpgradesClick.get(position).getNivel()));

            return view;
        }
    }

    private void saveData(){
        SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        Gson gson = new Gson();
        String json = gson.toJson(todosUpgradesClick);
        editor.putString("todosUpgradesClick", json);
        editor.apply();
    }

    private void loadData(){
        Toast.makeText(UpgradeClickActvity.this, "Carregou dados" ,Toast.LENGTH_LONG).show();
        SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPreferences.getString("todosUpgradesClick", null);
        Type type = new TypeToken<List<UpgradesClick>>() {}.getType();
        todosUpgradesClick = gson.fromJson(json, type);
        if(todosUpgradesClick == null){
            todosUpgradesClick = new ArrayList<UpgradesClick>();
        }
    }

}

最后,錯誤日志:

2018-10-30 21:34:44.470 1843-1963/? E/LogCollectService: illegal eventid
2018-10-30 21:34:45.343 12820-12820/? E/XmlParser: startElement mResult:1024
2018-10-30 21:34:45.343 12820-12820/? E/XmlParser: startElement mResult:2097152
2018-10-30 21:34:45.351 408-2015/? E/ion: set flags ioctrl failed!
2018-10-30 21:34:45.439 12706-12706/paixao.com.findingdawae E/AndroidRuntime: FATAL EXCEPTION: main
    Process: paixao.com.findingdawae, PID: 12706
    java.lang.RuntimeException: Unable to pause activity {paixao.com.findingdawae/paixao.com.findingdawae.UpgradeClickActvity}: java.lang.SecurityException: Can not make a java.lang.reflect.Method constructor accessible
        at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:3952)
        at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3918)
        at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3892)
        at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3860)
        at android.app.ActivityThread.-wrap16(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1588)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:156)
        at android.app.ActivityThread.main(ActivityThread.java:6523)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
     Caused by: java.lang.SecurityException: Can not make a java.lang.reflect.Method constructor accessible
        at java.lang.reflect.AccessibleObject.setAccessible0(AccessibleObject.java:133)
        at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:119)
        at com.google.gson.internal.reflect.PreJava9ReflectionAccessor.makeAccessible(PreJava9ReflectionAccessor.java:31)
        at com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:103)
        at com.google.gson.internal.ConstructorConstructor.get(ConstructorConstructor.java:85)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:101)
        at com.google.gson.Gson.getAdapter(Gson.java:458)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
        at com.google.gson.Gson.getAdapter(Gson.java:458)
        at com.google.gson.internal.bind.ArrayTypeAdapter$1.create(ArrayTypeAdapter.java:48)
        at com.google.gson.Gson.getAdapter(Gson.java:458)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
        at com.google.gson.Gson.getAdapter(Gson.java:458)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
        at com.google.gson.Gson.getAdapter(Gson.java:458)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
        at com.google.gson.Gson.getAdapter(Gson.java:458)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
        at com.google.gson.Gson.getAdapter(Gson.java:458)
2018-10-30 21:34:45.439 12706-12706/paixao.com.findingdawae E/AndroidRuntime:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
        at com.google.gson.Gson.getAdapter(Gson.java:458)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:56)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61)
        at com.google.gson.Gson.toJson(Gson.java:704)
        at com.google.gson.Gson.toJson(Gson.java:683)
        at com.google.gson.Gson.toJson(Gson.java:638)
        at com.google.gson.Gson.toJson(Gson.java:618)
        at paixao.com.findingdawae.UpgradeClickActvity.saveData(UpgradeClickActvity.java:133)
        at paixao.com.findingdawae.UpgradeClickActvity.onPause(UpgradeClickActvity.java:87)
        at android.app.Activity.performPause(Activity.java:7071)
        at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1335)
        at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:3941)
            ... 11 more
2018-10-30 21:34:45.443 1218-4703/? E/ReportTools: This is not beta user build
2018-10-30 21:34:45.518 554-830/? E/logserver: imonitor_add_dynamic_path, path:/data/system/dropbox/data_app_crash@1540935285455.txt.gz
2018-10-30 21:34:45.635 1218-6950/? E/HsmCoreServiceImpl: onTransact in code is: 102
2018-10-30 21:34:45.678 1020-12064/? E/AsyncOperation: serviceID=40, operation=LogOperation
    OperationException[Status{statusCode=Log from CONTEXT_MANAGER dropped because of storage full, resolution=null}]
        at oxj.a(:com.google.android.gms@14366021@14.3.66 (040408-213742215):72)
        at xey.run(:com.google.android.gms@14366021@14.3.66 (040408-213742215):27)
        at bdrz.run(:com.google.android.gms@14366021@14.3.66 (040408-213742215):2)
        at qjt.run(:com.google.android.gms@14366021@14.3.66 (040408-213742215):35)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at qpu.run(:com.google.android.gms@14366021@14.3.66 (040408-213742215))
        at java.lang.Thread.run(Thread.java:776)
2018-10-30 21:34:45.685 1020-12064/? E/AsyncOperation: serviceID=40, operation=LogOperation
    OperationException[Status{statusCode=Log from LB_COUNTERS dropped because of storage full, resolution=null}]
        at oxj.a(:com.google.android.gms@14366021@14.3.66 (040408-213742215):72)
        at xey.run(:com.google.android.gms@14366021@14.3.66 (040408-213742215):27)
        at bdrz.run(:com.google.android.gms@14366021@14.3.66 (040408-213742215):2)
        at qjt.run(:com.google.android.gms@14366021@14.3.66 (040408-213742215):35)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at qpu.run(:com.google.android.gms@14366021@14.3.66 (040408-213742215))
        at java.lang.Thread.run(Thread.java:776)
2018-10-30 21:34:45.720 1020-12064/? E/AsyncOperation: serviceID=40, operation=LogOperation
    OperationException[Status{statusCode=Log from CONTEXT_MANAGER dropped because of storage full, resolution=null}]
        at oxj.a(:com.google.android.gms@14366021@14.3.66 (040408-213742215):72)
        at xey.run(:com.google.android.gms@14366021@14.3.66 (040408-213742215):27)
        at bdrz.run(:com.google.android.gms@14366021@14.3.66 (040408-213742215):2)
        at qjt.run(:com.google.android.gms@14366021@14.3.66 (040408-213742215):35)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at qpu.run(:com.google.android.gms@14366021@14.3.66 (040408-213742215))
        at java.lang.Thread.run(Thread.java:776)

向您的UpgradesClick類添加無參數構造函數

public UpgradesClick() {

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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