Невозможно реализовать асинхронную задачу для загрузки изображения в Firebase - PullRequest
0 голосов
/ 02 сентября 2018

Я застрял на том, как реализовать код в блоке finally, используя asynctask. Для загрузки изображения требуется время, и к тому времени пользователь, возможно, уже нажал на sendButton, перенеся его к следующему действию и отправив imageURL как ноль. Если я дам время, прежде чем нажать «Отправить», то есть дождемся появления URL-адреса загрузки в журнале, приложение будет работать нормально. Поэтому мне нужна помощь, как реализовать этот код в асинхронной задаче. Я попытался поместить большую часть кода в новую функцию, но затем смог вызвать функцию в классе myTask.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_snaps)
    val userInputMessage = findViewById<EditText>(R.id.userinput)
    val sendButton = findViewById<ImageButton>(R.id.sendButton)
    userInputMessage.visibility = View.INVISIBLE
    sendButton.visibility = View.INVISIBLE
    checkStoragePermission()
    val imageButton = findViewById<ImageButton>(R.id.imagebutton)
    imageButton.setOnClickListener {
        imageButton.visibility = View.INVISIBLE
        createImageGallery()
        lock()
        val storageDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
        val galleryFolder = File(storageDirectory, resources.getString(R.string.app_name))
        val argument = createImageFile(galleryFolder)
        val outputPhoto: FileOutputStream? = FileOutputStream(argument)
        try {
            textureview.getBitmap().compress(Bitmap.CompressFormat.PNG, 40, outputPhoto)
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            // Do this part async
            val imageTBP: Uri = Uri.fromFile(argument)
            val storageRef = storage.getReference().child("images").child(imagetbpname)
            val uploadTask = storageRef.putFile(imageTBP)
            uploadTask.addOnFailureListener(OnFailureListener{
                Toast.makeText(this, "Upload Failed", Toast.LENGTH_SHORT).show()
            }).addOnSuccessListener(OnSuccessListener<UploadTask.TaskSnapshot>{
                storageRef.getDownloadUrl().addOnSuccessListener(OnSuccessListener<Uri> {
                    downloadURL = it.toString()
                    Log.i("URL", downloadURL)
                })
            })

            try {
                if(outputPhoto != null){
                    outputPhoto.close()
                }
            } catch (e: IOException){
                Log.e(TAG, e.toString())
            }
            sendButton.visibility = View.VISIBLE
            userInputMessage!!.visibility = View.VISIBLE
        }
    }
    sendButton.setOnClickListener {
        val intent = Intent(this, ChooseUserActivity::class.java)
        intent.putExtra("imageName", imagetbpname)
        Toast.makeText(this, "download URL $downloadURL", Toast.LENGTH_LONG).show()
        intent.putExtra("imageURL", downloadURL)
        intent.putExtra("Message", userInputMessage!!.text.toString())
        startActivity(intent)
    }
}

class myTask: AsyncTask<Void, String, Void>() {
    override fun doInBackground(vararg p0: Void?): Void? {

        return null
}

    override fun onProgressUpdate(vararg values: String?) {
        super.onProgressUpdate(*values)
    }

}

1 Ответ

0 голосов
/ 02 сентября 2018

попробуйте использовать это вместо верхнего подхода. и сделать вас val uploadTask является глобальной переменной

`sendButton.setOnClickListener {
   uploadTask.addOnFailureListener(OnFailureListener{
      Toast.makeText(this, "Upload Failed", Toast.LENGTH_SHORT).show()
    }).addOnSuccessListener(OnSuccessListener<UploadTask.TaskSnapshot>{
          storageRef.getDownloadUrl().addOnSuccessListener(OnSuccessListener<Uri> {
              downloadURL = it.toString()
              val intent = Intent(this, ChooseUserActivity::class.java)
              intent.putExtra("imageName", imagetbpname)
              Toast.makeText(this, "download URL $downloadURL", Toast.LENGTH_LONG).show()
              intent.putExtra("imageURL", downloadURL)
              intent.putExtra("Message", userInputMessage!!.text.toString())
              startActivity(intent)`
              Log.i("URL", downloadURL)
          })
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...