如何在Android中使用SharedReference保存在线数据

如何在Android中使用SharedReference保存在线数据,android,sqlite,android-fragments,android-sharedpreferences,Android,Sqlite,Android Fragments,Android Sharedpreferences,我想在我的活动中显示3个片段,并在任何片段中加载来自json的数据!我需要使用okhttpv3库将网站数据显示到Recyclerview中 我想为离线显示此数据,我的意思是,如果用户关闭数据/wifi,则为离线显示此数据。但是我不想使用SQLite数据库 为此,我使用SharedReference保存数据,并在禁用网络时显示脱机此首选项中的数据 我写了下面的代码,但当禁用网络时,不显示me数据,使离线 异步任务代码: public class freeDataInfo { private

我想在我的
活动中显示3个
片段
,并在任何
片段中加载来自
json
的数据!我需要使用
okhttpv3
库将网站数据显示到
Recyclerview

我想为离线显示此数据,我的意思是,如果用户关闭数据/wifi,则为离线显示此数据。但是我不想使用SQLite数据库
为此,我使用
SharedReference
保存数据,并在禁用网络时显示脱机
首选项中的数据

我写了下面的代码,但当禁用网络时,不显示me数据,使离线

异步任务代码:

public class freeDataInfo {
    private Context mContext;
    private String ServerAddress = freeServer_IP.getFreeIP();

    public void getFreeDataInfo(Context context) {
        mContext = context;
        //new getInfo().execute(ServerAddress + "limit=10");
        new getInfo().execute(ServerAddress);
    }

    private class getInfo extends AsyncTask<String, Void, String> {
        EventBus bus = EventBus.getDefault();
        private String ou_response;
        private List<DataModel> infoModels = new ArrayList<>();
        private ProgressDialog dialog;

        @Override
        protected void onPreExecute() {
            //CustomProcessDialog.createAndShow(mContext);
            //infoModels = new ArrayList<>();

            // Initiate Progress
            dialog = new ProgressDialog(mContext);
            this.dialog.setMessage("شکیبا باشید...");
            this.dialog.show();

            infoModels.clear();
        }

        @Override
        protected String doInBackground(String... params) {
            OkHttpClient client = new OkHttpClient();

            //String url = (String) params[0];
            Request request = new Request.Builder()
                    //.url(ServerAddress + "limit=10")
                    .url(ServerAddress)
                    .cacheControl(CacheControl.FORCE_NETWORK)
                    .build();

            Response response;
            try {
                response = client.newCall(request).execute();
                ou_response = response.body().string();
                response.body().close();
                if (ou_response != null) {
                    try {
                        JSONObject postObj = new JSONObject(ou_response);
                        JSONArray postsArray = postObj.optJSONArray("result");

                        for (int i = 0; i <= postsArray.length(); i++) {
                            JSONObject postObject = (JSONObject) postsArray.get(i);


                            int id = postObject.getInt("id");
                            Log.d("id", String.valueOf(id));
                            String title = postObject.getString("title");
                            String description = postObject.getString("full_description");
                            String image = postObject.getString("image");
                            String category = postObject.getString("categoryName");
                            String date = postObject.getString("date");
                            String url = postObject.getString("url");

                            Log.d("Data", "Post ID: " + id);
                            Log.d("Data", "Post title: " + title);
                            Log.d("Data", "Post image: " + image);
                            Log.d("Data", "Post url: " + url);
                            Log.d("Data", "---------------------------------");

                            //Use the title and id as per your requirement
                            infoModels.add(new DataModel(id, title, description, category, date, url, image));
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                        Log.e("error", String.valueOf(e));
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
                Log.e("error2", String.valueOf(e));
            }
            return ou_response;
        }

        @Override
        protected void onPostExecute(String result) {
            //CustomProcessDialog.dissmis();

            //Stop Progress
            if (dialog.isShowing()) {
                dialog.dismiss();
            }

            if (result != null) {
                bus.post(new MyEvent("forfragment1", infoModels));
            } else {
                //Toast.makeText(mContext, "اتصال اینترنت خود را بررسی کنید", Toast.LENGTH_LONG).show();

                if (isNetworkStatusAvialable(mContext)) {
                    //Here your normal parsing while network available
                    SharedPreferences app_preferences1 = PreferenceManager.getDefaultSharedPreferences(mContext);
                    SharedPreferences.Editor editor = app_preferences1.edit();
                    editor.putString("jsonResponse", ou_response);
                    editor.commit();

                } else {
                    final SharedPreferences app_preferences1 = PreferenceManager.getDefaultSharedPreferences(mContext);
                    String response = app_preferences1.getString("jsonResponse", "");

                    try {
                        JSONObject postObj = new JSONObject(response);
                        JSONArray postsArray = postObj.optJSONArray("result");

                        for (int i = 0; i <= postsArray.length(); i++) {
                            JSONObject postObject = (JSONObject) postsArray.get(i);

                            int id = postObject.getInt("id");
                            Log.d("id", String.valueOf(id));
                            String title = postObject.getString("title");
                            String description = postObject.getString("full_description");
                            String image = postObject.getString("image");
                            String category = postObject.getString("categoryName");
                            String date = postObject.getString("date");
                            String url = postObject.getString("url");

                            Log.d("Data", "Post ID: " + id);
                            Log.d("Data", "Post title: " + title);
                            Log.d("Data", "Post image: " + image);
                            Log.d("Data", "Post url: " + url);
                            Log.d("Data", "---------------------------------");

                            //Use the title and id as per your requirement
                            infoModels.add(new DataModel(id, title, description, category, date, url, image));
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                        Log.e("error", String.valueOf(e));
                    }
                }

            }
        }
    }

    public static boolean isNetworkStatusAvialable(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivityManager != null) {
            NetworkInfo netInfos = connectivityManager.getActiveNetworkInfo();
            if (netInfos != null)
                if (netInfos.isConnected())
                    if (netInfos.isAvailable())
                        return true;
        }
        return false;
    }
}
public class free_fragment extends Fragment {

    private RecyclerView mRecyclerView;
    private free_recycler_adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    private List<DataModel> dataModels = new ArrayList<DataModel>();
    private List<DataModel> infoModels = new ArrayList<>();
    //private ArrayList<DataModel> dataModels;

    private Context context;
    private boolean isDataFetched;
    private boolean mIsVisibleToUser;
    private View view;

    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        view = inflater.inflate(R.layout.fragment_free_layout, container, false);

        context = getContext();

        if (mIsVisibleToUser) {
            LoadData();
        }

        ///----- RecyclerView -----
        mRecyclerView = (RecyclerView) view.findViewById(R.id.pdf_RecyclerView);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        mAdapter = new free_recycler_adapter(context, dataModels);
        mRecyclerView.setAdapter(mAdapter);

        return view;
    }

    @Subscribe
    public void onEvent(MyEvent event) {
        List<DataModel> dataModels = event.getInfoModels();
        if (dataModels.size() > 0) {
            dataModels.remove(dataModels.size() - 1);
            mAdapter.notifyItemRemoved(dataModels.size());
            //mAdapter.setLoaded();
        }
        if (event.fragmentTag.equals("forfragment1")) {
            mAdapter.add(dataModels);
            isDataFetched = true;
            mAdapter.notifyDataSetChanged();
        }
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        mIsVisibleToUser = isVisibleToUser;
        if (isVisibleToUser && !isDataFetched && getContext() != null) {
            context = getContext();
            LoadData(); //Remove this call from onCreateView
        }
    }

        private void LoadData() {
            freeDataInfo dataInfo = new freeDataInfo();
            // here getMainDataInfo() should return the server response
            dataInfo.getFreeDataInfo(context);
        }

        @Override
        public void onResume() {
            super.onResume();
            EventBus.getDefault().register(this);
        }

        @Override
        public void onPause() {
            EventBus.getDefault().unregister(this);
            super.onPause();
        }
public class free_recycler_adapter extends RecyclerView.Adapter<free_recycler_adapter.ViewHolder> {
    private List<DataModel> mDateSet;
    private Context context;
    private ArrayList<DataModel> mModels;

    // Provide a suitable constructor (depends on the kind of dataset)
    public free_recycler_adapter(Context context, List<DataModel> dataSet) {
        this.context = context;
        this.mDateSet = dataSet;
    }

    public free_recycler_adapter(ArrayList<DataModel> models) {
        this.mModels = models;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public free_recycler_adapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // create a new view
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.free_card_layout, parent, false);

        // create ViewHolder
        return new ViewHolder(view);
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, final int position) {

        // - get data from your itemsData at this position
        // - replace the contents of the view with that itemsData

        viewHolder.free_titleText.setText(Html.fromHtml(mDateSet.get(position).getTitle()));

        Glide.with(context)
                .load(mDateSet.get(position).getImage())
                .placeholder(R.drawable.ic_download_image)
                .override(200, 200)
                .crossFade(500)
                .into(viewHolder.free_avatarImage);

        viewHolder.free_descText.setText(Html.fromHtml(mDateSet.get(position).getDescription()));
        viewHolder.free_descText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.getContext().startActivity(new Intent(v.getContext(), ContentPage.class)
                        .putExtra("title", mDateSet.get(position).getTitle())
                        .putExtra("desc", mDateSet.get(position).getDescription())
                        .putExtra("image", mDateSet.get(position).getImage())
                        .putExtra("url", mDateSet.get(position).getUrl())
                        .putExtra("category", mDateSet.get(position).getCategory())
                        .putExtra("date", mDateSet.get(position).getDate()));
            }
        });

    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return mDateSet.size();
    }

    public void remove(int position) {
        mDateSet.remove(position);
        notifyItemRemoved(position);
    }

    public void clear() {
        mDateSet.clear();
        notifyDataSetChanged();
    }

    public void add(List<DataModel> models) {
        mDateSet.addAll(models);
        notifyDataSetChanged();
    }

    public void update(List<DataModel> models) {
        mDateSet.clear();
        mDateSet.addAll(models);
        notifyDataSetChanged();
    }

    // inner class to hold a reference to each item of RecyclerView
    public static class ViewHolder extends RecyclerView.ViewHolder {

        public TextView free_titleText, free_descText;
        public ImageView free_avatarImage;

        public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);

            free_titleText = (TextView) itemLayoutView.findViewById(R.id.pdf_card_title);
            free_descText = (TextView) itemLayoutView.findViewById(R.id.pdf_card_content);
            free_avatarImage = (ImageView) itemLayoutView.findViewById(R.id.pdf_card_image);

        }
    }
}
公共类freeDataInfo{
私有上下文;
私有字符串ServerAddress=freeServer_IP.getFreeIP();
public void getFreeDataInfo(上下文){
mContext=上下文;
//新建getInfo().execute(ServerAddress+“limit=10”);
新建getInfo().execute(服务器地址);
}
私有类getInfo扩展了异步任务{
EventBus=EventBus.getDefault();
私有字符串ou_响应;
private List infoModels=new ArrayList();
私人对话;
@凌驾
受保护的void onPreExecute(){
//CustomProcessDialog.createAndShow(mContext);
//infoModels=newarraylist();
//启动进程
dialog=新建ProgressDialog(mContext);
this.dialog.setMessage(“شکیبببب㶎ید…”);
this.dialog.show();
infoModels.clear();
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
OkHttpClient=新的OkHttpClient();
//字符串url=(字符串)参数[0];
Request Request=newrequest.Builder()
//.url(服务器地址+“限制=10”)
.url(服务器地址)
.cacheControl(cacheControl.FORCE_网络)
.build();
反应;
试一试{
response=client.newCall(request.execute();
ou_response=response.body().string();
response.body().close();
if(ou_响应!=null){
试一试{
JSONObject postObj=新JSONObject(ou_响应);
JSONArray postsArray=postObj.optJSONArray(“结果”);

对于(int i=0;i您可以使用
toString()将源
JsonObject
保存到
SharedReference
方法。脱机时,从
SharedReference
读取字符串,然后用该字符串重新创建
JsonObject
,并像从服务器获取一样处理它

你能用我上面的代码给我发送真实的代码吗?我是业余爱好者。请问你在帖子中没有看到你的代码被更改了吗?这样行吗?