2016-10-04 1 views
1

온라인으로 만족스러운 답변을 찾을 수 없어서이 질문을 올리고 있습니다.Android : 웹 서비스, 오프라인 기능

외부 서버 (내 경우 localhost MySQL 서버)에서 데이터를 가져 와서 화면에 표시하는 Android 앱을 개발 중입니다.

그러나이 제약 조건은 사람이 인터넷에 항상 연결되어 있어야 전화에서 볼 수있는 모든 데이터를 가져와야한다는 것입니다.

자, 이제 데이터가 외부 서버에서 검색되면 장치에 저장해야합니다. 그래야 사용자가 인터넷에 연결하지 않고도 앱을 열어 볼 수 있습니다. 가져온 데이터를 보여줘야한다.

즉, 오프라인 기능을 갖고 싶습니다.

어떻게하면됩니까?

답변

0

내 응용 프로그램에 대해 동일한 구현했습니다. 코드를 살펴보고 코드를 수행하는 방법을 이해할 수 있습니다. 나는 같은 것을 위해 Retrofit을 사용했다. sharedpreference에있는 nursejson이 null인지 확인했습니다. null 인 경우는, 그 sharedpreference로부터 데이터를로드하지 않으면 API를 히트하도록 (듯이) 계속 진행한다.

목록을 새로 고치려면 인터넷에 연결되어 있는지 확인한 다음 해당 공유 기본 설정을 삭제하고 getnurse 메서드를 다시 호출하십시오.

//After Oncreate 
pref = getApplicationContext().getSharedPreferences("CachedResponse", 0); 
editor = pref.edit(); 
editor.apply(); 
// Call getNurses method 
getNurses(); 



//Method to get Nurses 
public void getNurses() { 

    nurseJson = pref.getString("nurseJson", null); 

    if (nurseJson != null) { 

     progressBar.setVisibility(View.INVISIBLE); 

     gson = new Gson(); 
     nurse = gson.fromJson(nurseJson, Nurse.class); 
     nurseList = nurse.getNurse(); 
     namesArrayList.clear(); 

     for (String nurses : nurseList) { 
      namesArrayList.add(nurses); 
     } 

     namesAdapter.notifyDataSetChanged(); 

    } else { 

     Call<Nurse> call = apiInterface.getNursesList(); 
     call.enqueue(new Callback<Nurse>() { 
      @Override 
      public void onResponse(Call<Nurse> call, Response<Nurse> response) { 

       progressBar.setVisibility(View.INVISIBLE); 

       onItemsLoadComplete(); 

       if (response.isSuccessful()) { 

        nurse = response.body(); 

        nurseJson = new Gson().toJson(nurse); 
        editor.putString("nurseJson", nurseJson); 
        editor.commit(); 

        nurseList = nurse.getNurse(); 

        namesArrayList.clear(); 

        for (String nurses : nurseList) { 
         namesArrayList.add(nurses); 
        } 

        namesAdapter.notifyDataSetChanged(); 

       } else { 

        utility.createSnackbar(coordinatorLayout, "Error Occurred, Please Try Again Later!"); 

       } 
      } 

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

       progressBar.setVisibility(View.INVISIBLE); 

       onItemsLoadComplete(); 

       if (t.getLocalizedMessage() != null) { 

        if (t.getLocalizedMessage().contains("Unable to resolve host")) { 

         utility.createSnackbar(coordinatorLayout, "Please Check Internet Connection!"); 

        } else { 

         utility.createSnackbar(coordinatorLayout, "Error Occurred, Please Try Again Later!"); 

        } 

       } else { 

        utility.createSnackbar(coordinatorLayout, "Error Occurred, Please Try Again Later!"); 

       } 
      } 
     }); 

    } 

}