是否有一种方法可以从API调用中一次获取数据以进行改造?

时间:2018-10-02 13:59:06

标签: android android-fragments retrofit retrofit2 android-networking

我在导航抽屉中有一个Fragment,在onCreate方法中有一个改进的api调用,用于从服务器中获取一些数据。

ApiInterface apiService = ApiClient.getClient(false).create(ApiInterface.class);
    Call<MoviesWrapper> call = apiService.getMovies("upcoming", PreferencesHelper.getLanguage(context), "US");
    call.enqueue(new Callback<MoviesWrapper>() {
        @Override
        public void onResponse(Call<MoviesWrapper> call, Response<MoviesWrapper> response) {
            MoviesWrapper moviesWrapper = response.body();
            assert moviesWrapper != null;
            final HomeAdapter moviesAdapter = new HomeAdapter(getContext(), moviesWrapper.getMovies(), null, true);
            moviesRv.setAdapter(moviesAdapter);
            progressBar1.setVisibility(View.GONE);
        }

        @Override
        public void onFailure(Call<MoviesWrapper> call, Throwable t) {
            Log.e(Constants.STRINGS.FAILURE, t.toString());
        }
    });

我的问题是每次我进入片段时,翻新都会从服务器获取数据。有没有一种方法可以缓存数据以进行翻新,而不必每次都进行api调用?

4 个答案:

答案 0 :(得分:0)

您可以在活动中调用 API 并将响应传递给片段,这样可以防止每次都对片段进行递归调用。

您可以共享一些代码,我将提供详细的解决方案。

答案 1 :(得分:0)

改造无法缓存已获取的数据本身。最好的方法是获取它们,然后通过使用例如将其保存在本地数据库中。房间持久性库或领域。

策略应该这样:

  1. 检查本地数据库中的数据是否存在。
  2. 如果不获取它们并保存在本地数据库中
  3. 从本地数据库加载数据并显示在屏幕上

还应该创建负责此功能的类。并实现回调/监听器,它将把这些类中的数据提供给您的片段。因为在Activity或Fragment中实现API调用是错误的选择。它在开发中造成了巨大的混乱。

答案 2 :(得分:0)

如果未从API更改数据,则可以将数据存储到SharedPreferences或本地数据库中,也可以将数据序列化到ObjectSerializer(ByteArrayInputStream / ByteArrayOutputStream。如果更改了数据,则可以将Firebase推送通知实现为推送就会出现,然后可以使用该API,您将获得该数据。希望它可以让您了解可以根据需要在所有这些方法中使用什么

答案 3 :(得分:0)

1。将这两行添加到build.gradle(app)

implementation 'com.squareup.retrofit2:retrofit:2.1.0'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'

2。创建以下结构

->API
        ->ApiClient
        ->ApiInterface      
->database
        ->dbHelper
        ->itemDB
->models
        ->IitemResult
        ->restItems

3。 ApiCleint.java

package test.com.testapp.API;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class APIClient {

    public static final String BASE_URL = "TEST_URL";
    private static Retrofit retrofit = null;

    public static Retrofit getClient()
    {
        if (retrofit == null)
        {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;

    }
}

4。 ApiInterface.java

package test.com.testapp.API;

import retrofit2.Call;
import retrofit2.Retrofit;
import retrofit2.http.GET;
import test.com.testapp.models.IItemResult;

public interface ApiInterface {
    @GET("String id")
    Call<IItemResult> getItems();   

}

5。 dbHelper.java

package test.com.testapp.database;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;
import java.util.List;

import test.com.testapp.models.restItems;

public class dbHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "DsTest";

    public dbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(ItemDB.CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + ItemDB.TABLE_NAME);
        onCreate(sqLiteDatabase);
    }

    public long InsertItem(restItems restItem){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(ItemDB.COLUMN_BRAND_DEC, restItem.getBrandDesc());
        values.put(ItemDB.COLUMN_MRP, restItem.getmRP());
        values.put(ItemDB.COLUMN_VAT_RATE, restItem.getVatRate());

        long id = db.insert(ItemDB.TABLE_NAME, null, values);

        db.close();

        return id;
    }

    public List<restItems> getItemList(){

        List<restItems> restItems =new ArrayList<>();

        String selectQuery = "SELECT  * FROM " + ItemDB.TABLE_NAME + " ORDER BY " +
                ItemDB.COLUMN_ID + " DESC";

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        if (cursor.moveToFirst()) {
            do {
                restItems item = new restItems();
                //   item.setId(cursor.getInt(cursor.getColumnIndex(Note.COLUMN_ID)));
                item.setBrandDesc(cursor.getColumnName(1));
                item.setmRP(cursor.getColumnName(2));
                item.setVatRate(cursor.getColumnName(3));

                restItems.add(item);
            } while (cursor.moveToNext());
        }

        db.close();

        return restItems;
    }
}

6。 ItemDb.java

package test.com.testapp.database;

public class ItemDB {

    public static final String TABLE_NAME = "items";

    public static final String COLUMN_ID = "id";
    public static final String COLUMN_BRAND_DEC = "brand_dec";
    public static final String COLUMN_MRP = "mrp";
    public static final String COLUMN_VAT_RATE = "vat_rate";

    private String Id;
    private String Brand_Desc;
    private String Mrp;
    private String Vat_rate;

    public ItemDB(String id, String brand_Desc, String mrp, String vat_rate) {
        Id = id;
        Brand_Desc = brand_Desc;
        Mrp = mrp;
        Vat_rate = vat_rate;
    }

    public ItemDB() {
    }

    public String getId() {
        return Id;
    }

    public void setId(String id) {
        Id = id;
    }

    public String getBrand_Desc() {
        return Brand_Desc;
    }

    public void setBrand_Desc(String brand_Desc) {
        Brand_Desc = brand_Desc;
    }

    public String getMrp() {
        return Mrp;
    }

    public void setMrp(String mrp) {
        Mrp = mrp;
    }

    public String getVat_rate() {
        return Vat_rate;
    }

    public void setVat_rate(String vat_rate) {
        Vat_rate = vat_rate;
    }

    public static final String CREATE_TABLE =
            "CREATE TABLE " + TABLE_NAME + "("
            + COLUMN_ID + "INTEGER PRIMARY KEY AUTO INCREMENT,"
            + COLUMN_BRAND_DEC + "TEXT,"
            + COLUMN_MRP + "TEXT,"
            + COLUMN_VAT_RATE + "TEXT"
                    + ")";
}

7。 restItems.java

package test.com.testapp.models;

import com.google.gson.annotations.SerializedName;

public class restItems {

    @SerializedName("Brand")
    private String brand;
    @SerializedName("MRP")
    private String mrp;
    @SerializedName("VAT")
    private String vat;

    public restItems(String brand, String mrp, String vat) {
        this.brand = brand;
        this.mrp = mrp;
        this.vat = vat;
    }

    public restItems() {
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getMrp() {
        return mrp;
    }

    public void setMrp(String mrp) {
        this.mrp = mrp;
    }

    public String getVat() {
        return vat;
    }

    public void setVat(String vat) {
        this.vat = vat;
    }

    @Override
    public String toString() {
        return "restItems{" +
                "brand='" + brand + '\'' +
                ", mrp='" + mrp + '\'' +
                ", vat='" + vat + '\'' +
                '}';
    }
}

8。 IItemResult .java

package test.com.testapp.models;

import com.google.gson.annotations.SerializedName;

import java.util.List;

public class IItemResult {
    @SerializedName("iItemResult")
    private List<restItems>iItemResult = null;

    public IItemResult(List<restItems> iItemResult) {
        this.iItemResult = iItemResult;
    }

    public void setiItemResult(List<restItems> iItemResult) {
        this.iItemResult = iItemResult;
    }

    public List<restItems> getiItemResult() {
        return iItemResult;
    }
}

9。 MainActivity.java

package test.com.testapp;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import test.com.testapp.API.APIClient;
import test.com.testapp.API.ApiInterface;
import test.com.testapp.database.dbHelper;
import test.com.testapp.models.IItemResult;

public class MainActivity extends AppCompatActivity {

    private Button getData;
    private ProgressBar bar;
    private dbHelper db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getData = (Button)findViewById(R.id.btnGet);
        bar = (ProgressBar)findViewById(R.id.pBar);

        getData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new insertData().execute("");
            }
        });

    }

    private class insertData extends AsyncTask<String, Void, String>
    {
        @Override
        protected void onPreExecute() {
            bar.setVisibility(View.VISIBLE);
        }

        @Override
        protected String doInBackground(String... strings) {
            ApiInterface apiInterface = APIClient.getClient().create(ApiInterface.class);

            db = new dbHelper(getApplicationContext());

            Call<IItemResult>resultCall = apiInterface.getItems();
            resultCall.enqueue(new Callback<IItemResult>() {
                @Override
                public void onResponse(Call<IItemResult> call, Response<IItemResult> response) {
                    System.out.println("MAIN_ACTIVITY"  + response.body().getiItemResult().size());
                    System.out.println(response.body().getiItemResult().get(1));

                    for (int i=0; i<response.body().getiItemResult().size(); i++)
                    {
                        db.InsertItem(response.body().getiItemResult().get(i));
                    }

                    System.out.println("DB_RESULT: " + db.getItemList());
                }

                @Override
                public void onFailure(Call<IItemResult> call, Throwable t) {

                }
            });
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

            bar.setVisibility(View.GONE);
        }
    }
}