Я симпатичный новичок в разработке приложений для Android. Я пытаюсь открыть приложение для создания электронной книги. И приложение запущено. Но когда я пытаюсь открыть фрагмент загрузки, возникает эта ошибка, и приложение вылетает! Вот код Java для активности фрагмента - пакет com.domain.app.Fragment;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.loopj.android.http.*;
import com.domain.app.Activity.MainActivity;
import com.domain.app.Activity.Search;
import com.domain.app.Adapter.DownloadAdapter;
import com.domain.app.DataBase.DatabaseHandler;
import com.domain.app.Item.DownloadList;
import com.domain.app.R;
import com.domain.app.Util.Constant_Api;
import com.wang.avi.AVLoadingIndicatorView;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class DownloadFragment extends Fragment {
private RecyclerView recyclerView;
private AVLoadingIndicatorView progressBar;
private SwipeRefreshLayout mSwipeRefreshLayout;
private DownloadAdapter downloadAdapter;
public MenuItem searchItem;
private List<File> inFiles;
private List<DownloadList> downloadListsCompair;
private String root;
private DatabaseHandler db;
private ProgressDialog progressDialog;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.category_fragment, container, false);
MainActivity.toolbar.setTitle(getResources().getString(R.string.download));
db = new DatabaseHandler(getActivity());
progressDialog = new ProgressDialog(getActivity());
inFiles = new ArrayList<>();
downloadListsCompair = new ArrayList<>();
root = Environment.getExternalStorageDirectory() + "/appName/";
mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefresh_category_fragment);
progressBar = (AVLoadingIndicatorView) view.findViewById(R.id.progressbar_category_fragment);
recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView_category_fragment);
progressBar.hide();
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setFocusable(false);
mSwipeRefreshLayout.setColorSchemeResources(R.color.toolbar);
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
new Execute().execute();
mSwipeRefreshLayout.setRefreshing(false);
}
});
new Execute().execute();
setHasOptionsMenu(true);
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.search_menu, menu);
searchItem = menu.findItem(R.id.ic_searchView);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener((new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
startActivity(new Intent(getActivity(), Search.class)
.putExtra("search", query));
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return true;
}
}));
MenuItemCompat.setOnActionExpandListener(searchItem,
new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when collapsed
return true; // Return true to collapse action view
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
return true; // Return true to expand action view
}
});
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// action with ID action_refresh was selected
default:
break;
}
return super.onOptionsItemSelected(item);
}
class Execute extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
progressDialog.show();
progressDialog.setMessage(getResources().getString(R.string.loading));
progressDialog.setCancelable(false);
Constant_Api.downloadLists.clear();
inFiles.clear();
downloadListsCompair.clear();
Constant_Api.db = new DatabaseHandler(getContext());
Constant_Api.downloadLists = Constant_Api.db.getDownload();
super.onPreExecute();
}
@Override
protected String doInBackground(String... strings) {
File file = new File(root);
getListFiles(file);
getDownloadLists(inFiles);
return null;
}
@Override
protected void onPostExecute(String s) {
downloadAdapter = new DownloadAdapter(getActivity(), downloadListsCompair);
recyclerView.setAdapter(downloadAdapter);
progressDialog.dismiss();
super.onPostExecute(s);
}
}
private List<File> getListFiles(File parentDir) {
// List<File> inFiles = new ArrayList<>();
Queue<File> files = new LinkedList<>();
files.addAll(Arrays.asList(parentDir.listFiles()));
while (!files.isEmpty()) {
File file = files.remove();
if (file.isDirectory()) {
files.addAll(Arrays.asList(file.listFiles()));
} else if (file.getName().endsWith(".epub") || file.getName().endsWith(".pdf")) {
inFiles.add(file);
}
}
return inFiles;
}
private List<DownloadList> getDownloadLists(List<File> list) {
for (int i = 0; i < Constant_Api.downloadLists.size(); i++) {
for (int j = 0; j < list.size(); j++) {
if (list.get(j).toString().contains(Constant_Api.downloadLists.get(i).getUrl())) {
downloadListsCompair.add(Constant_Api.downloadLists.get(i));
break;
} else {
if (j == list.size() - 1) {
db.deletePdf(Constant_Api.downloadLists.get(i).getId());
}
}
}
}
return downloadListsCompair;
}
}
И вот ошибка, которую я вижу в окне запуска в Android Studio -
V/FA: Inactivity, disconnecting from the service
I/zygote: JIT allocated 56KB for compiled code of void android.view.View.<init>(android.content.Context, android.util.AttributeSet, int, int)
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
Process: com.domain.app, PID: 12493
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:353)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.NullPointerException
at java.util.Objects.requireNonNull(Objects.java:203)
at java.util.Arrays$ArrayList.<init>(Arrays.java:3741)
at java.util.Arrays.asList(Arrays.java:3728)
at com.domain.app.Fragment.DownloadFragment.getListFiles(DownloadFragment.java:181)
at com.domain.app.Fragment.DownloadFragment.access$500(DownloadFragment.java:43)
at com.domain.app.Fragment.DownloadFragment$Execute.doInBackground(DownloadFragment.java:164)
at com.domain.app.Fragment.DownloadFragment$Execute.doInBackground(DownloadFragment.java:146)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
E/RecyclerView: No adapter attached; skipping layout
V/FA: Recording user engagement, ms: 10252
V/FA: Connecting to remote service
V/FA: Activity paused, time: 4589154
D/FA: Logging event (FE): adunit_exposure(_xu), Bundle[{firebase_event_origin(_o)=am, ad_unit_id(_ai)=ca-app-pub-3940256099942544/6300978111, firebase_screen_class(_sc)=MainActivity, firebase_screen_id(_si)=751889283038278768, exposure_time(_xt)=9442}]
V/FA: Connection attempt already in progress
D/FA: Logging event (FE): ad_exposure(_xa), Bundle[{firebase_event_origin(_o)=am, firebase_screen_class(_sc)=MainActivity, firebase_screen_id(_si)=751889283038278768, exposure_time(_xt)=9442}]
V/FA: Connection attempt already in progress
D/FA: Logging event (FE): user_engagement(_e), Bundle[{firebase_event_origin(_o)=auto, engagement_time_msec(_et)=10252, firebase_screen_class(_sc)=MainActivity, firebase_screen_id(_si)=751889283038278768}]
V/FA: Connection attempt already in progress
Not logging ad unit exposure. No active activity
Not logging ad exposure. No active activity
D/EGL_emulation: eglMakeCurrent: 0xe62e4f20: ver 2 0 (tinfo 0xe624c000)
D/EGL_emulation: eglMakeCurrent: 0xe62e4f20: ver 2 0 (tinfo 0xe624c000)
D/EGL_emulation: eglMakeCurrent: 0xe62e4f20: ver 2 0 (tinfo 0xe624c000)
D/FA: Connected to remote service
V/FA: Processing queued up service tasks: 4
D/EGL_emulation: eglMakeCurrent: 0xe62e4f20: ver 2 0 (tinfo 0xe624c000)
D/EGL_emulation: eglMakeCurrent: 0xe62e4f20: ver 2 0 (tinfo 0xe624c000)
D/EGL_emulation: eglMakeCurrent: 0xe62e4f20: ver 2 0 (tinfo 0xe624c000)
E/WindowManager: android.view.WindowLeaked: Activity com.domain.app.Activity.MainActivity has leaked window DecorView@2ec76c[] that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:485)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:346)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
at android.app.Dialog.show(Dialog.java:330)
at com.domain.app.Fragment.DownloadFragment$Execute.onPreExecute(DownloadFragment.java:150)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:648)
at android.os.AsyncTask.execute(AsyncTask.java:595)
at com.domain.app.Fragment.DownloadFragment.onCreateView(DownloadFragment.java:91)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2343)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1421)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1752)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1821)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2595)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2382)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2337)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2244)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:702)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
V/FA: Inactivity, disconnecting from the service
I/Ads: Ad is not visible. Not refreshing ad.
Scheduling ad refresh 60000 milliseconds from now.
I/Ads: Ad is not visible. Not refreshing ad.
Scheduling ad refresh 60000 milliseconds from now.
Пожалуйста, помогите мне найти настоящую проблему и как ее решить! Заранее спасибо... :)
root - это каталог, объявленный здесь. Итак, могу ли я использовать root.listFiles ()? Пробовал, но тоже не сработало ... :(
Что находится в строке 181 согласно трассировке стека?
files.addAll (Arrays.asList (parentDir.listFiles ()));
Убедитесь, что значение parentDir.listFiles() равно нулю.
Это не ноль, потому что внутри doInBackground() перечислены File file = new File(root); getListFiles(file);. И корень также объявлен поверх файла, где он указывает на действительный каталог!
Что вы имеете в виду под «перечисленными getListFiles(file);»? Это метод, в котором происходит сбой.
Не возражаете, если я пришлю вам проект, и вы увидите его в студии android?
Конечно. Выложите на GitHub.
Могу я получить вашу электронную почту, пожалуйста? По какой-то причине я не могу сейчас выложить его в публичный репозиторий. Но я могу вас послать! У меня здесь недостаточно очков репутации, поэтому я тоже не могу отправить вас в чат! Думаю, я не понимаю проблемы. Но я думаю, вы найдете в кратчайшие сроки ... :)
Моя электронная почта находится в моем профиле GitHub, ссылка на который вы можете найти в моем профиле SO.
Я отправил вам ссылку для скачивания! :)
После обновления зависимостей и исправления некоторых проблем в имеющихся у вас библиотеках проблем со сбоями не возникало. Я рекомендую вам исправить эти проблемы. Кроме того, AsyncTasks должен быть статическим. Все, что у вас есть в onPreExecute(), может быть помещено во фрагмент перед выполнением AsyncTask, и вы можете передать обратный вызов AsyncTask, чтобы запустить то, что вам нужно в onPostExecute().
Вы можете прислать мне экспортированный zip-архив? Это будет очень полезно, поскольку я не знаю, как обновить эти зависимости и что мне следует обновить! :)
@TheWanderer проблема все еще существует. Когда вы запускаете приложение, пропустите действие входа в систему, затем откройте панель меню и нажмите на параметр «Загрузить», чтобы открыть фрагмент загрузки. Тогда действительно возникает проблема. В остальном все остальное в приложении работает отлично!
Я сделал это, и это было нормально. На скольких устройствах вы это тестировали?
Только на эмуляторе. Но позвольте мне проверить это на моем реальном устройстве!
Неа. Только что протестировал на моем устройстве Android 8.0. Но он все время рушится на одном и том же месте. Он вылетает только тогда, когда я пытаюсь открыть в меню опцию «Загрузки». Обратите внимание, что в вашей версии DownloadFragment.java такой же, как и мой старый. Я не вижу обновлений, которые вы упомянули в своем последнем комментарии. Может быть, этого не хватает с моей стороны и проблема остается!
Я только что обновил некоторые зависимости в Gradle и код в тех библиотеках, которые вы включили.
Я работаю над проектом, который вы прислали мне по электронной почте. Но все равно эти ошибки попадают в журнал! Мне надоело!




parentDir.listFiles(), скорее всего, возвращает null, что означает, что это, вероятно, не каталог.