在AsyncTask(Kotlin)上使用filesDir

时间:2019-02-21 18:18:11

标签: java android service kotlin android-asynctask

我正在尝试运行访问本地存储的服务,查找尚未上载到服务器的项,然后上载它们。尝试分配文件名时,我在活动中一直使用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 :(得分:1)

ServiceContext。更确切地说是它的子类。因此,您可以像在getFilesDir()中一样调用Activity

但是,您发布的代码不会显示Service,而是显示AsyncTask ...我不知道您在哪里创建AsyncTask,但是您仍然可以通过上下文作为参数。

编辑 好像OP正在寻找一种将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)