我在导航抽屉中有一个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调用?
答案 0 :(得分:0)
您可以在活动中调用 API 并将响应传递给片段,这样可以防止每次都对片段进行递归调用。
您可以共享一些代码,我将提供详细的解决方案。
答案 1 :(得分:0)
改造无法缓存已获取的数据本身。最好的方法是获取它们,然后通过使用例如将其保存在本地数据库中。房间持久性库或领域。
策略应该这样:
还应该创建负责此功能的类。并实现回调/监听器,它将把这些类中的数据提供给您的片段。因为在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);
}
}
}