FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.java:239)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NoClassDefFoundError: java.util.Objects
at com.backendless.Persistence.find(Persistence.java:627)
at com.backendless.DataStoreFactory$1.find(DataStoreFactory.java:176)
at com.akilieducation.Grade1.ui.fragment.GalleryFragment$1RefreshTask.doInBackground(GalleryFragment.java:334)
at com.akilieducation.Grade1.ui.fragment.GalleryFragment$1RefreshTask.doInBackground(GalleryFragment.java:308)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
Below is my GalleryFragment code kindly assist while running in android api 17
package com.akilieducation.Grade1.ui.fragment;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.Toast;
import com.aspsine.multithreaddownload.DownloadInfo;
import com.aspsine.multithreaddownload.DownloadManager;
import com.backendless.Backendless;
import com.backendless.persistence.DataQueryBuilder;
import com.akilieducation.Grade1.App;
import com.akilieducation.Grade1.R;
import com.akilieducation.Grade1.model.Publication;
import com.akilieducation.Grade1.model.PublicationInfo;
import com.akilieducation.Grade1.listener.OnItemClickListener;
import com.akilieducation.Grade1.model.PublicationRealm;
import com.akilieducation.Grade1.model.Session;
import com.akilieducation.Grade1.model.SessionInfo;
import com.akilieducation.Grade1.model.SessionRealm;
import com.akilieducation.Grade1.service.DownloadService;
import com.akilieducation.Grade1.ui.activity.GalleryActivity;
import com.akilieducation.Grade1.ui.activity.ViewerActivity;
import com.akilieducation.Grade1.ui.adapter.PublicationAdapter;
import com.akilieducation.Grade1.util.Utils;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import io.realm.Realm;
import io.realm.RealmList;
import io.realm.RealmResults;
import io.realm.Sort;
public class GalleryFragment extends Fragment implements OnItemClickListener<PublicationInfo>, SwipeRefreshLayout.OnRefreshListener {
@Bind(R.id.listView)
ListView listView;
private SwipeRefreshLayout swipeRefreshLayout;
private List<PublicationInfo> mPublicationInfos;
private PublicationAdapter mAdapter;
private DownloadReceiver mReceiver;
public GalleryFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPublicationInfos = new ArrayList<>();
mAdapter = new PublicationAdapter();
mAdapter.setOnItemClickListener(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_list_view, container, false);
swipeRefreshLayout = (SwipeRefreshLayout)view.findViewById(R.id.swipe_refresh_layout);
swipeRefreshLayout.setOnRefreshListener(this);
swipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(true);
fetchPublications();
}
}
);
ButterKnife.bind(this, view);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
listView.setAdapter(mAdapter);
mAdapter.setData(mPublicationInfos);
register();
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onItemClick(View v, final int position, final PublicationInfo publicationInfo) {
if (v.getId() == R.id.btnDownload) {
if (publicationInfo.getStatus() == PublicationInfo.STATUS_DOWNLOADING ||
publicationInfo.getStatus() == PublicationInfo.STATUS_CONNECTING) {
pause(publicationInfo.getZipURL());
} else if (publicationInfo.getStatus() == PublicationInfo.STATUS_READY) {
openPublication(publicationInfo);
} else {
download(position, publicationInfo.getZipURL(), publicationInfo);
// Backendless.Counters.incrementAndGet(publicationInfo.getPublicationObjectId(), new AsyncCallback<Long>() {
// @Override
// public void handleResponse(Long response) {
// System.out.print(response.toString());
// }
//
// @Override
// public void handleFault(BackendlessFault fault) {
// System.out.print(fault.toString());
// }
// });
}
} else {
if (v.getId() == R.id.btnDelete) {
new AlertDialog.Builder(this.getActivity())
.setTitle(getString(R.string.Confirm))
.setMessage(getString(R.string.delete_question))
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
File dir = new File(App.getPublicationsDir() + File.separator + publicationInfo.getPublicationObjectId());
if (dir.exists() && dir.isDirectory()) {
try {
FileUtils.deleteDirectory(dir);
publicationInfo.setStatus(PublicationInfo.STATUS_NOT_DOWNLOAD);
mAdapter.notifyDataSetChanged();
} catch (IOException ioEx) {
ioEx.printStackTrace();
}
}
SharedPreferences.Editor editor = App.getPreferences().edit();
editor.remove(publicationInfo.getPublicationObjectId() + "_LAST_PAGE");
editor.commit();
}})
.setNegativeButton(android.R.string.no, null).show();
}
}
}
private void register() {
mReceiver = new DownloadReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(DownloadService.ACTION_DOWNLOAD_BROAD_CAST);
LocalBroadcastManager.getInstance(getContext()).registerReceiver(mReceiver, intentFilter);
}
private void download(int position, String tag, PublicationInfo info) {
DownloadService.intentDownload(getActivity(), position, tag, info);
}
private void pause(String tag) {
DownloadService.intentPause(getActivity(), tag);
}
private void openPublication(PublicationInfo publicationInfo) {
Intent intent = new Intent(getContext(), ViewerActivity.class);
intent.putExtra(GalleryActivity.EXTRA_PUBLICATION_INFO, publicationInfo);
getContext().startActivity(intent);
}
class DownloadReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action == null || !action.equals(DownloadService.ACTION_DOWNLOAD_BROAD_CAST)) {
return;
}
final int position = intent.getIntExtra(DownloadService.EXTRA_POSITION, -1);
final PublicationInfo tmpInfo = (PublicationInfo) intent.getSerializableExtra(DownloadService.EXTRA_ISSUE_INFO);
if (tmpInfo == null || position == -1) {
return;
}
if (mPublicationInfos == null || mPublicationInfos.size() == 0 || swipeRefreshLayout.isRefreshing()) {
return;
}
final PublicationInfo publicationInfo = mPublicationInfos.get(position);
final int status = tmpInfo.getStatus();
switch (status) {
case PublicationInfo.STATUS_CONNECTING:
publicationInfo.setStatus(PublicationInfo.STATUS_CONNECTING);
if (isCurrentListViewItemVisible(position)) {
PublicationAdapter.ViewHolder holder = getViewHolder(position);
holder.btnDownload.setText(publicationInfo.getButtonText());
holder.btnDelete.setVisibility(View.GONE);
}
break;
case PublicationInfo.STATUS_DOWNLOADING:
publicationInfo.setStatus(PublicationInfo.STATUS_DOWNLOADING);
publicationInfo.setProgress(tmpInfo.getProgress());
publicationInfo.setDownloadPerSize(tmpInfo.getDownloadPerSize());
if (isCurrentListViewItemVisible(position)) {
PublicationAdapter.ViewHolder holder = getViewHolder(position);
holder.tvDownloadPerSize.setText(publicationInfo.getDownloadPerSize());
holder.tvDownloadPerSize.setVisibility(View.VISIBLE);
holder.progressBar.setProgress(publicationInfo.getProgress());
holder.progressBar.setVisibility(View.VISIBLE);
holder.btnDownload.setText(publicationInfo.getButtonText());
holder.btnDelete.setVisibility(View.GONE);
}
break;
case PublicationInfo.STATUS_COMPLETE:
publicationInfo.setStatus(PublicationInfo.STATUS_COMPLETE);
publicationInfo.setProgress(tmpInfo.getProgress());
publicationInfo.setDownloadPerSize(tmpInfo.getDownloadPerSize());
if (isCurrentListViewItemVisible(position)) {
PublicationAdapter.ViewHolder holder = getViewHolder(position);
holder.btnDownload.setText(publicationInfo.getButtonText());
holder.tvDownloadPerSize.setText(publicationInfo.getDownloadPerSize());
holder.progressBar.setProgress(publicationInfo.getProgress());
holder.btnDelete.setVisibility(View.GONE);
}
break;
case PublicationInfo.STATUS_READY:
publicationInfo.setStatus(PublicationInfo.STATUS_READY);
publicationInfo.setProgress(tmpInfo.getProgress());
publicationInfo.setDownloadPerSize(tmpInfo.getDownloadPerSize());
if (isCurrentListViewItemVisible(position)) {
PublicationAdapter.ViewHolder holder = getViewHolder(position);
holder.btnDownload.setText(publicationInfo.getButtonText());
holder.tvDownloadPerSize.setVisibility(View.GONE);
holder.progressBar.setVisibility(View.GONE);
holder.btnDelete.setVisibility(View.VISIBLE);
}
break;
case PublicationInfo.STATUS_PAUSED:
publicationInfo.setStatus(PublicationInfo.STATUS_PAUSED);
if (isCurrentListViewItemVisible(position)) {
PublicationAdapter.ViewHolder holder = getViewHolder(position);
holder.btnDownload.setText(publicationInfo.getButtonText());
holder.btnDelete.setVisibility(View.GONE);
}
break;
case PublicationInfo.STATUS_NOT_DOWNLOAD:
publicationInfo.setStatus(PublicationInfo.STATUS_NOT_DOWNLOAD);
publicationInfo.setProgress(tmpInfo.getProgress());
publicationInfo.setDownloadPerSize(tmpInfo.getDownloadPerSize());
if (isCurrentListViewItemVisible(position)) {
PublicationAdapter.ViewHolder holder = getViewHolder(position);
holder.btnDownload.setText(publicationInfo.getButtonText());
holder.progressBar.setProgress(publicationInfo.getProgress());
holder.progressBar.setVisibility(View.GONE);
holder.tvDownloadPerSize.setText(publicationInfo.getDownloadPerSize());
holder.tvDownloadPerSize.setVisibility(View.GONE);
holder.btnDelete.setVisibility(View.GONE);
}
break;
case PublicationInfo.STATUS_DOWNLOAD_ERROR:
publicationInfo.setStatus(PublicationInfo.STATUS_DOWNLOAD_ERROR);
publicationInfo.setDownloadPerSize("");
if (isCurrentListViewItemVisible(position)) {
PublicationAdapter.ViewHolder holder = getViewHolder(position);
holder.tvDownloadPerSize.setText("");
holder.btnDownload.setText(publicationInfo.getButtonText());
holder.btnDelete.setVisibility(View.GONE);
}
break;
}
mAdapter.notifyDataSetChanged();
}
}
private boolean isCurrentListViewItemVisible(int position) {
int first = listView.getFirstVisiblePosition();
int last = listView.getLastVisiblePosition();
return first <= position && position <= last;
}
private PublicationAdapter.ViewHolder getViewHolder(int position) {
int childPosition = position - listView.getFirstVisiblePosition();
View view = listView.getChildAt(childPosition);
return (PublicationAdapter.ViewHolder) view.getTag();
}
@Override
public void onRefresh() {
fetchPublications();
}
private void fetchPublications() {
class RefreshTask extends AsyncTask<Void, Integer, List<String>> {
@Override
protected void onPreExecute() {
super.onPreExecute();
swipeRefreshLayout.setRefreshing(true);
mPublicationInfos.clear();
}
@Override
protected List<String> doInBackground(Void... voids) {
List<String> objIDs = new ArrayList<String>();
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
DataQueryBuilder queryBuilder = DataQueryBuilder.create();
queryBuilder.setWhereClause("published = true");
queryBuilder.setPageSize(100);
queryBuilder.setSortBy( new ArrayList<String>(){{
add("publicationDate DESC");
add("name");
}} );
try {
List<Publication> publications = Backendless.Persistence.of(Publication.class).find(queryBuilder);
List<Publication> publicationList;
boolean continua = publications != null && publications.size() > 0;
while (continua) {
queryBuilder.prepareNextPage();
publicationList = Backendless.Persistence.of(Publication.class).find(queryBuilder);
if (publicationList == null || publicationList.size() == 0) {
continua = false;
} else {
publications.addAll(publicationList);
}
}
for (Publication publication : publications) {
objIDs.add(publication.getObjectId());
RealmList<SessionRealm> sessionsRealm = new RealmList<SessionRealm>();
Collections.sort(publication.getSessions(), new Comparator<Session>() {
@Override
public int compare(Session session, Session session2) {
return session.getInitialPage() - session2.getInitialPage();
}
}
);
for (Session session : publication.getSessions()) {
SessionRealm sessionRealm = realm.createObject(SessionRealm.class);
sessionRealm.setName(session.getName());
sessionRealm.setInitialPage(session.getInitialPage());
realm.copyToRealm(sessionRealm);
sessionsRealm.add(sessionRealm);
}
// Adding to realm
PublicationRealm publicationRealm = new PublicationRealm();
publicationRealm.setPublicationName(publication.getName());
publicationRealm.setPublicationDate(App.getDateFormat().format(publication.getPublicationDate()));
publicationRealm.setPublicationObjectId(publication.getObjectId());
publicationRealm.setPublicationPagesCount(publication.getPagesCount());
publicationRealm.setPublicationSlices(publication.getSlices());
publicationRealm.setSessionsRealm(sessionsRealm);
publicationRealm.setPublicationDateDate(publication.getPublicationDate());
realm.copyToRealmOrUpdate(publicationRealm);
}
realm.commitTransaction();
} catch (Exception e) {
realm.cancelTransaction();
return null;
}
return objIDs;
}
protected void onPostExecute(List<String> objIDs) {
// Remove from Realm and Files what was removed from Backendless
if (objIDs != null && objIDs.size() > 0) {
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
RealmResults<PublicationRealm> allRelms = realm.where(PublicationRealm.class).findAll();
if (objIDs.size() != allRelms.size()) {
for (PublicationRealm realmObj : allRelms) {
if (!objIDs.contains(realmObj.getPublicationObjectId())) {
File dir = new File(App.getPublicationsDir() + File.separator + realmObj.getPublicationObjectId());
if (dir.exists() && dir.isDirectory()) {
try {
FileUtils.deleteDirectory(dir);
} catch (IOException ioEx) {
ioEx.printStackTrace();
}
}
SharedPreferences.Editor editor = App.getPreferences().edit();
editor.remove(realmObj.getPublicationObjectId() + "_LAST_PAGE");
editor.commit();
realmObj.deleteFromRealm();
}
}
}
realm.commitTransaction();
} else {
Toast.makeText(getContext(), getString(R.string.no_network_connection), Toast.LENGTH_SHORT).show();
}
fetchPublicationsFromLocal();
}
}
new RefreshTask().execute((Void[])null);
}
private void fetchPublicationsFromLocal() {
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmResults<PublicationRealm> results = realm.where(PublicationRealm.class).findAllSorted("publicationDateDate", Sort.DESCENDING);
for (PublicationRealm publicationRealm : results) {
List<SessionInfo> sessionInfos = new ArrayList<SessionInfo>();
for (SessionRealm sessionRealm : publicationRealm.getSessionsRealm()) {
SessionInfo sessionInfo = new SessionInfo(sessionRealm.getName(), sessionRealm.getInitialPage());
sessionInfos.add(sessionInfo);
}
final PublicationInfo info = new PublicationInfo(publicationRealm.getPublicationObjectId(),
publicationRealm.getPublicationDate(), publicationRealm.getPublicationName(),
publicationRealm.getPublicationPagesCount(), publicationRealm.getPublicationSlices(), sessionInfos);
if (new File(App.getPublicationsDir() + File.separator + publicationRealm.getPublicationObjectId()).exists()) {
info.setProgress(100);
info.setStatus(PublicationInfo.STATUS_READY);
} else {
DownloadInfo downloadInfo = DownloadManager.getInstance().getDownloadProgress(info.getZipURL());
if (downloadInfo != null) {
info.setProgress(downloadInfo.getProgress());
info.setDownloadPerSize(Utils.getDownloadPerSize(downloadInfo.getFinished(), downloadInfo.getLength()));
info.setStatus(PublicationInfo.STATUS_PAUSED);
}
}
mPublicationInfos.add(info);
}
mAdapter.setData(mPublicationInfos);
mAdapter.notifyDataSetChanged();
swipeRefreshLayout.setRefreshing(false);
}
});
}
}