@Comatu

Как указать контекст (или обойтись без него) при вызове метода в паблик классе (не активити)?

Написал метод WriteBookList для записи ArrayList в файл внутренней памяти (в конце кода). При вызове требует контекст, которого в классе нет, это не активити...
Если делаю метод паблик и вызываю из активити, с контекстом все ОК, но требует ArrayList, которого там нет, его надо передавать коллбэком (я с ними не разобрался как следует, сложно реализовать).
Можно ли в данном примере обойтись без контекста и как это сделать? Я бы хотел именно в этом классе сделать запись массива в файл, который читать из любой активити.

public class ParseBookCovers extends AsyncTask<Void, Void, String> {

    public static String LOG_TAG = "my_log";

    HttpURLConnection urlConnection = null;
    BufferedReader reader = null;
    String resultJson = "";
    private String filename = "";
    ArrayList<String> urls = new ArrayList<>();
    ArrayList<Uri> urisImg = new ArrayList<>(); //массив Uri обложек книг

    @Override
    protected String doInBackground(Void... params) {
        // получаем данные с внешнего ресурса
        try {
            URL url = new URL("http://*********/booklist.json");

            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.connect();

            InputStream inputStream = urlConnection.getInputStream();
            StringBuffer buffer = new StringBuffer();

            reader = new BufferedReader(new InputStreamReader(inputStream));

            String line;
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            resultJson = buffer.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultJson;
    }

    @Override
    protected void onPostExecute(String strJson) {
        super.onPostExecute(strJson);
        JSONObject dataJsonObj = null;

        try {
            dataJsonObj = new JSONObject(strJson);
            JSONArray books = dataJsonObj.getJSONArray("books");

            for (int i = 0; i < books.length(); i++) {
                JSONObject book = books.getJSONObject(i);
                String url_book = book.getString("coverUrl");
                urls.add(url_book);// пишу урлы в ArrayList urls
//                Log.d(LOG_TAG, "coverUrl: " + url_book);

            }

            CoverLoader(urls);

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    /**
     * метод загружает файлы обложек
     */
    private void CoverLoader(ArrayList<String> urls) {
        for (int i = 0; i < urls.size(); i++) {
            int d = i + 1;
            filename = "bookcover_" + d + ".jpg";
            String dir = "/" + filename;
            ThinDownloadManager downloadManager = new ThinDownloadManager(5); //количество потоков загрузки
            Uri downloadUri = Uri.parse(urls.get(i));
            Uri destinationUri = Uri.parse(dir);
            urisImg.add(destinationUri);
            DownloadRequest downloadRequest = new DownloadRequest(downloadUri).setDestinationURI(destinationUri);
            downloadManager.add(downloadRequest);
            Log.d(LOG_TAG, urls.get(i));
        }

    }


    private void WriteBooksList(Context c, ArrayList<String> urls) throws IOException {
        FileOutputStream fos = c.openFileOutput("booklist.txt", Context.MODE_PRIVATE);
        ObjectOutputStream os = new ObjectOutputStream(fos);
        os.writeObject(urls);
        os.close();
        Log.d(LOG_TAG, "File has been written");
    }

}
  • Вопрос задан
  • 174 просмотра
Решения вопроса 1
thelongrunsmoke
@thelongrunsmoke
Программист
Таск вызывается из активити? Тогда перегружай конструктор и передавай в нём контекст. Иначе, либо инжекти контекст дагером, либо, что плохо, объявляй статик в классе приложения и используй его.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@red-barbarian
Использовать getApplicationContext
Получать его как говорили в конструкторе или как синглтон из application сделать. Application живет дольше вьюх, поэтому уменьшается риск утечек памяти.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы