Я застрял на том, как реализовать код в блоке 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)
}
}