перегруженный метод dispatchKeyEvent останавливает приложение при добавлении в него кода постобработки - PullRequest
0 голосов
/ 30 сентября 2019

В настоящее время я работаю над приложением, которое использует сканер штрих-кода для сканирования некоторых штрих-кодов. Итак, я собираю данные, перегружая метод dispatchKeyEvent . Все работает хорошо, пока я не пытаюсь постобработать предложенный штрих-код.

Например, этот фрагмент кода работает, как и ожидалось.

private var promptedEAN:String = ""
override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
        if(event?.action == KeyEvent.ACTION_DOWN) {

            val pressedKey: Char = event.getUnicodeChar().toChar()
            promptedEAN += pressedKey

            val eTMengeKomm = findViewById<EditText>(R.id.eTMengeKomm)
            eTMengeKomm.setText(promptedEAN, TextView.BufferType.EDITABLE)

            val etCharge = findViewById<EditText>(R.id.eTCharge)
            etCharge.setText(promptedEAN, TextView.BufferType.EDITABLE)

            val etMHD = findViewById<EditText>(R.id.eTMHD)
            etMHD.setText(promptedEAN, TextView.BufferType.EDITABLE)
       }

       return super.dispatchKeyEvent(event)
}

НО , как только я хочу постобработать запрашиваемый штрих-код внутри dispatchKeyEvent метод, все приложение зависает . В этом случае мне нужно перейти в Настройки -> Приложение -> Принудительно остановить, чтобы убить мое приложение, потому что ни одна из кнопок не работает.

Мой код постобработки работает без проблем - я опробовал его с помощью тестовой строки в методе onCreate моей деятельности.

У меня вопрос почему я получаю такое поведение с помощью метода dispatchKeyEvent ?

Это мой код. Я заполняю HashMap парами ключ-значение в методе OnCreate , который запускается до запуска dispatchKeyEvent .

    private var promptedEAN:String = ""
    private var testPromptedEAN:String = "" //"C10207613037926927200015200600370098$1092547017L4"
    private val hashMap : HashMap<String, Int> = HashMap()

    override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
        if(event?.action == KeyEvent.ACTION_DOWN) {

            val pressedKey: Char = event.getUnicodeChar().toChar()
            promptedEAN += pressedKey
            testPromptedEAN = promptedEAN


            val eTMengeKomm = findViewById<EditText>(R.id.eTMengeKomm)
            eTMengeKomm.setText(promptedEAN, TextView.BufferType.EDITABLE)

            val etCharge = findViewById<EditText>(R.id.eTCharge)
            etCharge.setText(promptedEAN, TextView.BufferType.EDITABLE)

            val etMHD = findViewById<EditText>(R.id.eTMHD)
            etMHD.setText(promptedEAN, TextView.BufferType.EDITABLE)

            if (testPromptedEAN.contains("C1",true) or testPromptedEAN.contains("C0",true)) { // EAN-128 Code
                var pos:Int = 2 // init pos
                var tail:String = testPromptedEAN.substring(pos) // init tail
                var lookInString:String =""

                    while (pos<testPromptedEAN.length-1) {
                        var searchString:String = testPromptedEAN.substring(pos, pos+2) // look into 2-digit codes first
                        if (hashMap.containsKey(searchString)){
                        var lengthData4code:Int = hashMap.getValue(searchString) // get length of data for code from hash table
                        if (tail.length<lengthData4code){
                            lengthData4code = tail.length
                            lookInString = tail.substring(searchString.length, lengthData4code)

                        } else {
                            lookInString = tail.substring(searchString.length, searchString.length+lengthData4code) // data (part)string
                        }

                        if (lookInString.indexOf("$")>=0) { // string size is actually shorter than expected
                        lookInString = tail.substring(searchString.length,searchString.length+lookInString.indexOf("$"))
                        pos += (searchString.length + lookInString.length + 1)
                        } else {
                        pos += (searchString.length+ lengthData4code)
                        }

                        if (pos>=testPromptedEAN.length-1) {tail = ""}
                        else {tail = testPromptedEAN.substring(pos)}


                        if (searchString.contains("37", false)) {
                        //val eTMengeKomm = findViewById<EditText>(R.id.eTMengeKomm)
                        eTMengeKomm.setText(lookInString, TextView.BufferType.EDITABLE)
                        }

                        if (searchString.contains("10", false)) {
                        //val etCharge = findViewById<EditText>(R.id.eTCharge)
                        etCharge.setText(lookInString, TextView.BufferType.EDITABLE)
                        }

                        if (searchString.contains("15", false)) {
                        //val etMHD = findViewById<EditText>(R.id.eTMHD)
                        etMHD.setText(lookInString, TextView.BufferType.EDITABLE)
                        }
                    }
                }
            }

        }
        return super.dispatchKeyEvent(event)
    }

Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 02 октября 2019

Как я решил эту проблему:

Прежде всего, я избавился от перегруженного dispachKeyEvent метода. Это создавало много беспорядка в моем приложении, в моем случае, спина и средняя кнопка вообще не реагировали. USB-сканер штрих-кода должен в основном распознаваться в Android как внешняя клавиатура, поэтому этот метод не требовался для захвата штрих-кодов в определенное поле EditText. После этого я установил фокус на первое поле EditText и запросил там штрих-код.

Во-вторых, я узнал, что while цикл не работает вАктивный поток пользовательского интерфейса - это было причиной, почему мое приложение все время зависало. Вот почему я реализовал AsyncTask как внутренний класс в своей Деятельности и поместил всю логику обработки фона в перегруженный метод doInBackround из AsyncTask. В методе onPostExecute я установил все необходимые значения для моих полей EditText.

Спасибо ТАК за предоставленную мне возможность учиться новому:).

...