@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");
    }

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

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

Похожие вопросы