Использование файловDir на AsyncTask (Kotlin) - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь запустить службу, которая обращается к локальному хранилищу, находит элементы, которые не были загружены на сервер, и загружает их.При попытке назначить имя файла я использовал filesDir в своей деятельности.Я считаю, что для filesDir необходим контекст, которого нет у службы, которую я создаю.Есть ли альтернатива этому?Вот мой код:

class AuthorizationSaveTask : AsyncTask<Int, Int, String>() {

override fun onPreExecute() {

}

override fun doInBackground(vararg params: Int?): String {

    val startId = params[0]

    //Get data for list view
    var authorizationArrayList = ArrayList<AuthorizationObject>()
    try {
        //Set target file to authorizations.txt
        val targetFile = File(filesDir, "authorizations.txt")
        //Create new file input stream
        val fis = FileInputStream(targetFile)
        //Create new object input stream, using fis
        val ois = ObjectInputStream(fis)
        //write object input stream to object

        //TODO: There has to be a better syntax than this.
        authorizationArrayList = (ois.readObject() as ArrayList<*>).filterIsInstance<AuthorizationObject>() as ArrayList<AuthorizationObject>
        //close object output stream
        ois.close()
        //close file output stream
        fis.close()

    } catch (e: ClassNotFoundException) {
        e.printStackTrace()
    } catch (e: IOException) {
        e.printStackTrace()
    }
    return "Service complete $startId"
}

override fun onProgressUpdate(vararg values: Int?) {
    super.onProgressUpdate(*values)
    val counter = values[0]
    Log.i("BEAU", "Service Running $counter")
}

override fun onPostExecute(result: String) {
    Log.i("BEAU", result)
}

Спасибо за ваше время!Пожалуйста, дайте мне знать, если я могу предоставить любую дополнительную информацию.

1 Ответ

0 голосов
/ 21 февраля 2019

A Service IS Context.Точнее подкласс этого.Таким образом, вы можете вызывать getFilesDir() так же, как в Activity.

Однако код, который вы публикуете, не показывает Service, а скорее AsyncTask ... Я неНе знаю, где вы создаете AsyncTask, но вы все равно можете передать Контекст в качестве параметра.

РЕДАКТИРОВАТЬ Как кажется, ОП искал способ передать Context в AsynkTaskЯ отредактировал свой ответ.

Измените свой код на:

class AuthorizationSaveTask : AsyncTask<Int, Int, String>(val context: Context)

И где бы вы ни создавали вас, Задача передает контекст.

val task = AuthorizationSaveTask(this)

Возможно, вы захотитерассмотреть возможность передачи только файла.

class AuthorizationSaveTask : AsyncTask<Int, Int, String>(val saveDir: File)

А в вашем Activity:

val task = AuthorizationSaveTask(filesDir)
...