AndroidRuntime: FATAL EXCEPTION: AsyncTask #1

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&lt;Void, Integer, List&lt;String&gt;> {


 @Override
 protected void onPreExecute() {
 super.onPreExecute();
 swipeRefreshLayout.setRefreshing(true);
 mPublicationInfos.clear();
 }


 @Override
 protected List&lt;String&gt; doInBackground(Void... voids) {
 List&lt;String&gt; objIDs = new ArrayList&lt;String&gt;();


 Realm realm = Realm.getDefaultInstance();
 realm.beginTransaction();


 DataQueryBuilder queryBuilder = DataQueryBuilder.create();
 queryBuilder.setWhereClause("published = true");
 queryBuilder.setPageSize(100);
 queryBuilder.setSortBy( new ArrayList&lt;String&gt;(){{
 add("publicationDate DESC");
 add("name");
 }} );




 try {
 List&lt;Publication&gt; publications = Backendless.Persistence.of(Publication.class).find(queryBuilder);


 List&lt;Publication&gt; 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&lt;SessionRealm&gt; sessionsRealm = new RealmList&lt;SessionRealm&gt;();
 Collections.sort(publication.getSessions(), new Comparator&lt;Session&gt;() {
 @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&lt;String&gt; objIDs) {
 // Remove from Realm and Files what was removed from Backendless
 if (objIDs != null && objIDs.size() > 0) {
 Realm realm = Realm.getDefaultInstance();
 realm.beginTransaction();
 RealmResults&lt;PublicationRealm&gt; 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&lt;PublicationRealm&gt; results = realm.where(PublicationRealm.class).findAllSorted("publicationDateDate", Sort.DESCENDING);


 for (PublicationRealm publicationRealm : results) {
 List&lt;SessionInfo&gt; sessionInfos = new ArrayList&lt;SessionInfo&gt;();
 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);
 }
 });
 }
}

Our Android SDK uses java.util.Objects class, which is available starting from API 19 (Android 4.4+). You should change it in your manifest file.

Can’t I have support for API 17(Android 4.2+)?

I’ve created an internal task BKNDLSS-16132 to investigate this question. Will contact you here as soon as we have any news.