I am working on converting my java code to kotlin code ,But I am stuck at a point where I am not able to convert my lambda function which I previously written
class Utils {
interface Callback {
void onResult(MediaCodecInfo[] infos);
}
static final class EncoderFinder extends AsyncTask<String, Void, MediaCodecInfo[]> {
private Callback func;
EncoderFinder(Callback func) {
this.func = func;
}
@Override
protected MediaCodecInfo[] doInBackground(String... mimeTypes) {
return findEncodersByType(mimeTypes[0]);
}
@Override
protected void onPostExecute(MediaCodecInfo[] mediaCodecInfos) {
func.onResult(mediaCodecInfos);
}
}
static void findEncodersByTypeAsync(String mimeType, Callback callback) {
new EncoderFinder(callback).execute(mimeType);
}
}
This is how I used it in MainActivity in java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Utils.findEncodersByTypeAsync("abc", infos -> {
useInfos(infos);
});
}
}
My Utils class in Kotlin
object Utils {
internal interface Callback {
fun onResult(infos: Array<MediaCodecInfo?>?)
}
internal class EncoderFinder(func : Callback) : AsyncTask<String,Void,Array<MediaCodecInfo?>?>(){
var func : Callback = func
override fun doInBackground(vararg params: String?): Array<MediaCodecInfo?>? {
return findEncodersByType(params[0])
}
override fun onPostExecute(result: Array<MediaCodecInfo?>?) {
func.onResult(result)
}
}
internal fun findEncodersByTypeAsync(mimeType: String?, callback: Callback){
EncoderFinder(callback).execute(mimeType)
}
}
How can I achieve same in kotlin only in MainActivity, small help will be appreciated.
Utils.findEncodersByTypeAsync("abc") { useInfos(it) }
https://medium.com/mindorks/lambda-function-in-kotlin-22ded595298
Refer this information you get clear understanding of using lambda function with and without parameters
you have to change you Utils class function like this
object Utils {
internal interface Callback {
fun onResult(infos: Array<MediaCodecInfo?>?)
}
internal class EncoderFinder(func : Callback) : AsyncTask<String,Void,Array<MediaCodecInfo?>?>(){
var func : Callback = func
override fun doInBackground(vararg params: String?): Array<MediaCodecInfo?>? {
return findEncodersByType(params[0])
}
override fun onPostExecute(result: Array<MediaCodecInfo?>?) {
func.onResult(result)
}
}
internal fun findEncodersByTypeAsync(mimeType: String?, callback: (Array<MediaCodecInfo?>?) -> Unit){
EncoderFinder(callback as Callback).execute(mimeType)
}
}
and you can call it in MainActivity Like this :
class MainActivity : AppCompatActivity() {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Utils.findEncodersByTypeAsync("abc", infos -> {
useInfos(infos);
})
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.