Replace deprecated AsyncTask

Julien LepillerSat Jun 25 23:44:09+0200 2022

ebfd268

Replace deprecated AsyncTask

app/src/main/java/eu/lepiller/nani/DictionaryActivity.java

22
33
import android.app.Activity;
44
import android.content.Intent;
5-
import android.os.AsyncTask;
65
import android.os.Bundle;
76
87
import androidx.activity.result.contract.ActivityResultContracts;

4342
    List<String> langs;
4443
    String selectedLanguage = "";
4544
    private SwipeRefreshLayout refresher;
45+
    private DownloadThread downloadThread;
4646
4747
    @Override
4848
    protected void onCreate(Bundle savedInstanceState) {

119119
    }
120120
121121
    private void refresh() {
122-
        new DownloadTask().execute();
122+
        if(downloadThread == null)
123+
            downloadThread = new DownloadThread();
124+
        downloadThread.start();
123125
    }
124126
125127
    private void setObserver() {
126-
        LiveData<Boolean> data = DownloadTask.getRefreshingData();
128+
        if(downloadThread == null)
129+
            return;
130+
131+
        LiveData<Boolean> data = downloadThread.getRefreshingData();
127132
        data.observe(this, refreshing -> {
128133
            refresher.setRefreshing(refreshing);
129134
            if(!refreshing)

132137
    }
133138
134139
    private void unsetObserver() {
135-
        LiveData<Boolean> data = DownloadTask.getRefreshingData();
140+
        if(downloadThread == null)
141+
            return;
142+
        LiveData<Boolean> data = downloadThread.getRefreshingData();
136143
        data.removeObservers(this);
137144
    }
138145
139-
    private static class DownloadTask extends AsyncTask<String, Integer, Integer> {
140-
        final private static MutableLiveData<Boolean> refreshing = new MutableLiveData<>();
146+
    private class DownloadThread extends Thread {
147+
        final private MutableLiveData<Boolean> refreshing = new MutableLiveData<>();
141148
142-
        static LiveData<Boolean> getRefreshingData() {
149+
        LiveData<Boolean> getRefreshingData() {
143150
            return refreshing;
144151
        }
145152
146153
        @Override
147-
        protected Integer doInBackground(String... strings) {
154+
        public void run() {
148155
            refreshing.postValue(true);
156+
            update();
157+
            refreshing.setValue(false);
158+
        }
159+
160+
        private void update() {
149161
            try {
150162
                URL url = DictionaryFactory.getListUrl();
151163
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();

161173
                    byte[] data = new byte[4096];
162174
                    FileOutputStream output = new FileOutputStream(file);
163175
                    while((count = input.read(data)) != -1) {
164-
                        if (isCancelled()) {
165-
                            input.close();
166-
                            return null;
167-
                        }
168176
                        output.write(data, 0, count);
169177
                    }
170178
                } else {
171-
                    return R.string.error_dico_not_found;
179+
                    postResult(R.string.error_dico_not_found);
172180
                }
173181
            } catch (MalformedURLException e) {
174182
                e.printStackTrace();
175-
                return R.string.error_dico_url;
183+
                postResult(R.string.error_dico_url);
176184
            } catch (IOException e) {
177185
                e.printStackTrace();
178-
                return R.string.error_dico_io;
186+
                postResult(R.string.error_dico_io);
179187
            }
180-
            return null;
181188
        }
182189
183-
        @Override
184-
        protected void onPostExecute(Integer i) {
185-
            super.onPostExecute(i);
186-
            refreshing.setValue(false);
190+
        protected void postResult(Integer i) {
191+
            runOnUiThread(() -> postMessage(i));
187192
        }
188193
    }
189194
195+
    private void postMessage(Integer i) {
196+
        Snackbar.make(findViewById(R.id.dictionary_view), getString(i), Snackbar.LENGTH_LONG).show();
197+
        refresh();
198+
    }
199+
190200
    private void updateDataSet() {
191201
        DictionaryFactory.updatePackageList();
192202
        dictionaries.clear();