Я пытаюсь запросить некоторые данные, сохраненные в локальной базе данных комнаты, используя идентификатор.Я получил идентификатор из сериализованного объекта и передал его в мой класс модели представления, который вызывает хранилище для выполнения запроса с использованием dao.
Асинктаск используется для асинхронизации и возврата запрошенного значения из базы данных,Я создал интерфейс и инициализировал его в асинхронной задаче, чтобы я мог вернуть результат из db, но он не работает с NPE.
В действии я вызвал хранилище и передал сериализованные данные, например:
public class ViewSessionActivity extends AppCompatActivity implements View.OnClickListener{
private static final String TAG = ViewSessionActivity.class.getSimpleName();
private Toolbar toolbar;
private Sessions sessions; // serialized object from adapter
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_session);
init();
setSupportActionBar(toolbar);
}
private void init() {
// skipped fvid calls
sessions = (Sessions) getIntent().getSerializableExtra(Constants.SESSION_DETAIL_KEY);
Log.d(TAG, "Prog id:\t" + sessions.prog_sessionId);
//error occurs here which leads to async task call in repository
SessionsRepository.getRepository(getApplication()).getSessionByID(sessions.prog_sessionId);
}
и в репозитории:
public class SessionsRepository {
private static final String TAG = SessionsRepository.class.getSimpleName();
private SessionsDAO dao;
private static SessionsRepository repository = null;
private LiveData<List<Sessions>> allSessions;
private MutableLiveData<Boolean> loadingState;
private Context context;
private final SportsDatabase database;
public SessionsRepository(Application application) {
database = SportsDatabase.getInstance(application);
dao = database.sessionsDAO();
allSessions = dao.getAllSessions();
loadingState = new MutableLiveData<>();
context = application.getApplicationContext();
}
public static SessionsRepository getRepository(Application context){
if (repository == null){
repository = new SessionsRepository(context);
}
return repository;
}
public void fetchSessions() {
String coachId = new PrefsUtils(context).getCoachId();
Call<SessionDetails> call = RestClient.getRestInstance().getSessionsService().fetchSessions(coachId);
call.enqueue(new Callback<SessionDetails>() {
@Override
public void onResponse(Call<SessionDetails> call, Response<SessionDetails> response) {
if (response.isSuccessful()) {
loadingState.postValue(false); // remove progress
SessionDetails details = response.body();
List<Sessions> sessions = details.getSessions();
// Log.d(TAG, "N/w sesh size:\t" + sessions.size());
saveSessions(sessions);
}
}
@Override
public void onFailure(Call<SessionDetails> call, Throwable t) {
loadingState.postValue(false);
Toast.makeText(context, "Error Fetching Sessions", Toast.LENGTH_SHORT).show();
}
});
}
private void saveSessions(List<Sessions> sessions) {
new SaveSessionsTask(dao).execute(sessions);
}
// this method which calls the async task
public void getSessionByID(String id){
new FindSessionTask(dao, context).execute(id);
}
public LiveData<List<Sessions>> getSavedSessions() {
return allSessions;
}
public class SaveSessionsTask extends AsyncTask<List<Sessions>, Void, Void> {
private SessionsDAO dao;
public SaveSessionsTask(SessionsDAO dao) {
this.dao = dao;
}
@Override
protected Void doInBackground(List<Sessions>... lists) {
dao.addSessions(lists[0]);
return null;
}
}
public class FindSessionTask extends AsyncTask<String, Void, Sessions>{
private SessionsDAO dao;
private OnSessionResultCallback callback;
public FindSessionTask(SessionsDAO dao, Context context) {
this.dao = dao;
this.callback = (OnSessionResultCallback) context;
}
@Override
protected Sessions doInBackground(String... strings) {
Sessions sessions = dao.getSessionById(strings[0]);
return sessions;
}
@Override
protected void onPostExecute(Sessions sessions) {
super.onPostExecute(sessions);
Log.d(SessionsRepository.TAG, "Session name:\t" + sessions.session_name);
}
}
// need help in returning the session found from db in onpostexecute method
}
класс dao:
@Dao
public interface SessionsDAO {
@Insert
void addSessions(List<Sessions> sessions);
@Query("select * from sessions")
LiveData<List<Sessions>> getAllSessions();
@Query("select * from sessions where prog_sessionId = :id")
Sessions getSessionById(String id); // here
}
и обратный вызов интерфейса для получения данных в асинхронной задаче по методу post execute:
public interface OnSessionResultCallback {
void onSessionFound(Sessions sessions);
}
Ошибка в logcat:
Caused by: java.lang.ClassCastException: sashi.in.ecosports.extras.App cannot be cast to sashi.in.ecosports.interfaces.OnSessionResultCallback
at sashi.in.ecosports.rest.db.repositories.SessionsRepository$FindSessionTask.<init>(SessionsRepository.java:110)
at sashi.in.ecosports.rest.db.repositories.SessionsRepository.getSessionByID(SessionsRepository.java:82)
at sashi.in.ecosports.ui.activities.ViewSessionActivity.init(ViewSessionActivity.java:63)
at sashi.in.ecosports.ui.activities.ViewSessionActivity.onCreate(ViewSessionActivity.java:38)
at android.app.Activity.performCreate(Activity.java:6671)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
....
Я ожидал выйти из имени найденной сессии, но вместо этого получил NPE.Может кто-нибудь помочь мне в выполнении асинхронного запроса помещения, используя поле сущности в качестве строки поиска, чтобы вернуть всю сущность из списка.Как модель представления получает данные и нужен ли мой интерфейс?Благодаря.