如何在Android中没有SQLdatabase的情况下显示离线的在线数据?

时间:2016-07-09 07:54:33

标签: android sqlite android-fragments

我想在我的fragments中显示3 Activity,并在任何json中加载来自 fragments 的数据!我将网站数据显示在Recyclerview的{​​{1}}库中。
我希望将此数据显示为离线,我的意思是如果用户关闭数据/ wifi显示离线的此数据。但我不想使用 SQLite数据库
我可以使用 OkHTTP v3 缓存吗?
我不知道如何使用OkHTTP缓存 AsyncTask代码:

okhttp

适配器代码:

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();

            }
        }
    }
}

片段代码:

public class free_recycler_adapter extends RecyclerView.Adapter<free_recycler_adapter.ViewHolder> {
    private List<DataModel> mDateSet;
    private Context context;

    // 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;
    }

    // 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)
                .crossFade()
                .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);

        }
    }
}

如何在没有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 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(); } } 的情况下显示离线数据?谢谢所有&lt; 3

2 个答案:

答案 0 :(得分:0)

    if (isNetworkStatusAvialable(ctx)) {
        //Here your normal parsing while network available
          SharedPreferences app_preferences1 = PreferenceManager.getDefaultSharedPreferences(getBaseContext());      
   SharedPreferences.Editor editor = app_preferences1.edit();
                editor.putString("jsonresponse", "yourjsonresponse");
                editor.commit();

        } else {
           final SharedPreferences app_preferences1 = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
  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;

}

答案 1 :(得分:-1)

对于如何使用JsonWriter

,这是一个很好的example

这是JsonWriter的documentation

这应该用于写入json文件。

import java.io.FileWriter;
import java.io.IOException;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class JsonSimpleExample {
     public static void main(String[] args) {

    JSONObject obj = new JSONObject();
    obj.put("name", "mkyong.com");
    obj.put("age", new Integer(100));

    JSONArray list = new JSONArray();
    list.add("msg 1");
    list.add("msg 2");
    list.add("msg 3");

    obj.put("messages", list);

    try {

        FileWriter file = new FileWriter("c:\\test.json");
        file.write(obj.toJSONString());
        file.flush();
        file.close();

    } catch (IOException e) {
        e.printStackTrace();
    }

    System.out.print(obj);

     }

}

如果您想再次阅读本文,请使用以下代码:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JsonSimpleExample {
     public static void main(String[] args) {

    JSONParser parser = new JSONParser();

    try {

        Object obj = parser.parse(new FileReader("c:\\test.json"));

        JSONObject jsonObject = (JSONObject) obj;

        String name = (String) jsonObject.get("name");
        System.out.println(name);

        long age = (Long) jsonObject.get("age");
        System.out.println(age);

        // loop array
        JSONArray msg = (JSONArray) jsonObject.get("messages");
        Iterator<String> iterator = msg.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ParseException e) {
        e.printStackTrace();
    }

     }

}