Как вызвать метод Mainactivity в Asynctask для фоновой работы? - PullRequest
0 голосов
/ 18 апреля 2020

Я хочу, чтобы метод (присутствующий в MainActivity) вызывался из метода doInBackground(File... file) класса MyAsynctask (присутствующего в MainActivity), и этот метод должен работать в фоновом режиме, потому что это занимает много времени, и мое приложение на мгновение перестает работать и нет никакого появившегося диалогового окна, которое я вызывал в onPreExecute() методе, как решить проблему, вот мой код, он работает очень хорошо, но занимает слишком много времени, и мое приложение выглядит зависшим, но на самом деле это не так.

ArrayList<HashMap<String,String>> getPlayList(File rootFolder) {
    ArrayList<HashMap<String,String>> fileList = new ArrayList<>();

    try {
        File[] files = rootFolder.listFiles();
         //here you will get NPE if directory doesn't contains  any file,handle it like this.
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory() && !file.isHidden()) {
                    if (true) {
                        fileList.addAll(getPlayList(file));
                    }
                    else {
                        break;
                    }
                } else if (file.getName().endsWith(".pdf")) {
                    HashMap<String, String> song = new HashMap<>();
                    song.put("file_path", file.getAbsolutePath());
                    song.put("file_name", file.getName());
                    fileList.add(song);
                }
            }
        }
        return fileList;
    } catch (Exception e) {
        return null;
    }
}

И класс Asynctask ниже ..

private class AsyncTaskExample extends AsyncTask<File, String, ArrayList> {


    @Override
    protected ArrayList doInBackground(File... file) {

        ArrayList<HashMap<String,String>> songList=getPlayList(folder);
        if(songList!=null){
            for(int i=0;i<songList.size();i++){
                final String fileName=songList.get(i).get("file_name");
                final String filePath=songList.get(i).get("file_path");

            //saving filePath and filName in SQLite Database..
                saveFileToDatabase(filePath, fileName);

            }
        }
        return songList;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        p = new ProgressDialog(MainActivity.this);
        p.setMessage("Please wait...Loading..");
        p.setIndeterminate(false);
        p.setCancelable(false);
        p.show();
    }

    @Override
    protected void onPostExecute(ArrayList arrayList) {
        super.onPostExecute(arrayList);
        if (mFiles != null)
        {
            p.dismiss();
        }
        else
        {
            p.show();
        }
    }
}

Как эффективно выполнять работу?

Решение

И проблема заключалась в том, что эти строки кода были заданы ниже:

AsyncTaskExample taskExample = new AsyncTaskExample();
        folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
      //I was writing this below line..
        taskExample.doInBackground(folder);

      //but it should be like in line below..
      taskExample.execute(folder);

1 Ответ

1 голос
/ 18 апреля 2020

Я бы посоветовал вам определить обратный вызов и передать его через конструктор асинхронной задачи, чтобы вы могли уведомить свою основную деятельность, чтобы она отображала диалог, когда это необходимо.

Обратный вызов

public interface AsyncTaskExampleCallback {
    public void onShowDialog();
    public void onHideDialog();
}

Asyn c задача

class AsyncTaskExample extends AsyncTask<File, String, ArrayList> {

    @Nullable
    private AsyncTaskExampleCallback callback = null;

    public AsyncTaskExample(@NotNull AsyncTaskExampleCallback callback) {
        this.callback = callback;
    }

    @Override
    protected ArrayList doInBackground(File... file) {

        ArrayList<HashMap<String, String>> songList = getPlayList(folder);
        if (songList != null) {
            for (int i = 0; i < songList.size(); i++) {
                final String fileName = songList.get(i).get("file_name");
                final String filePath = songList.get(i).get("file_path");

                //saving filePath and filName in SQLite Database..
                saveFileToDatabase(filePath, fileName);

            }
        }
        return songList;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        if (callback != null) {
            callback.onShowDialog();
        }
    }

    @Override
    protected void onPostExecute(ArrayList arrayList) {
        super.onPostExecute(arrayList);
        if (mFiles != null) {
            if (callback != null) {
                callback.onHideDialog();
            }
        } else {
            if (callback != null) {
                callback.onShowDialog();
            }
        }
    }
}

Основная деятельность

public class MainActivity extends AppCompatActivity implements AsyncTaskExampleCallback {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        new AsyncTaskExample(this).execute();
    }

    @Override
    public void onShowDialog() {
        //Show dialog here
    }

    @Override
    public void onHideDialog() {
        //Hide dialog here
    }
}
...