сделать простой код, но приложение перестало работать в kotlin - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь выучить kotlin язык, и первое приложение для меня это взять данные из массива json. но проблема в том, что когда начинается отладка приложения, я получаю ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной и приложение перестают работать. В моем приложении для Android я описываю следующую конструкцию данных json

мой код:

package com.example.ali.test

import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_main.view.*
import org.json.JSONArray
import org.json.JSONObject
import java.io.BufferedReader
import java.io.InputStream
import java.io.InputStreamReader
import java.net.HttpURLConnection
import java.net.URL

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val url = "https://mysafeinfo.com/api/data?list=presidents&format=json"
        Download().execute(url)

    }
//    full class for json api
    inner class Download : AsyncTask<String,String,String>(){

        override fun onPreExecute() {
        }
//        for build connection
        override fun doInBackground(vararg p0: String?): String{

            try {

                val url = URL(p0[0])
                val urlConnect = url.openConnection() as HttpURLConnection
                urlConnect.connectTimeout = 700
                val inputStream = urlConnect.inputStream
                val dataJsonAsStr = covertStreamToString(urlConnect.inputStream)
                publishProgress(dataJsonAsStr)

                }   catch (e: Exception){

            }
            return ""
        }

//        for get items from json api
        override fun onProgressUpdate(vararg values: String?) {



        }

        override fun onPostExecute(result: String?) {

            super.onPostExecute(result)
            handleJson(result)

        }


    }

    fun handleJson (jsonString: String?){

        val jsonArray = JSONArray(jsonString)
        val list =  ArrayList<FlightShdu>()
        var x = 0
        while (x < jsonArray.length()){

            val jsonObject = jsonArray.getJSONObject(x)
            list.add(FlightShdu(

                jsonObject.getInt("id"),
                jsonObject.getString("nm")
            ))


            x++
        }
        val adapter = ListAdapte(this@MainActivity,list)
        flightShdu_list.adapter = adapter

    }

//    for connection api
    fun covertStreamToString (inputStream: InputStream): String {

        val bufferReader = BufferedReader(InputStreamReader(inputStream))
        var line:String
        var  allString:String=""
        try {
            do{
                line=bufferReader.readLine()
                if (line!=null)
                    allString+=line
            }while (line!=null)

            bufferReader.close()
        }catch (ex:java.lang.Exception){}

        return allString;
    }
}

ошибка в консоли:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.ali.test, PID: 24738
    java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386) 
     Caused by: org.json.JSONException: End of input at character 0 of 
        at org.json.JSONTokener.syntaxError(JSONTokener.java:449)
        at org.json.JSONTokener.nextValue(JSONTokener.java:97)
        at org.json.JSONArray.<init>(JSONArray.java:92)
        at org.json.JSONArray.<init>(JSONArray.java:108)
        at com.example.ali.test.MainActivity.handleJson(MainActivity.kt:68)
        at com.example.ali.test.MainActivity$Download.onPostExecute(MainActivity.kt:59)
        at com.example.ali.test.MainActivity$Download.onPostExecute(MainActivity.kt:27)
        at android.os.AsyncTask.finish(AsyncTask.java:660)
        at android.os.AsyncTask.-wrap1(AsyncTask.java)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6776)
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386) 

Кто-нибудь есть идеи, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

**

Используйте ваш код, как показано ниже:

**

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val s = tvDisplay.text.toString()

    btnOk.setOnClickListener {
        Download().execute(s)

    }
}

inner class Download : AsyncTask<String, Void, Void>() {
    override fun doInBackground(vararg ss: String?): Void? {
        validate(ss[0]!!)
        return null
    }


}

private fun validate(s:String) {

    if(s.isNotEmpty()){

        runOnUiThread {
            Toast.makeText(this, "Working :)", Toast.LENGTH_SHORT).show()
        }

    }
    else{
        runOnUiThread {
            Toast.makeText(this, "Not Working :(", Toast.LENGTH_SHORT).show()
        }
    }
}

}

0 голосов
/ 05 ноября 2018

Ваш doInBackground() всегда возвращает пустую строку, "". Эта пустая строка будет передана в качестве параметра в onPostExecute, который в свою очередь использует эту пустую строку в качестве параметра для handleJson. Когда вы пытаетесь создать массив JSON из этой пустой строки, он выдает исключение по индексу 0, так как у него больше нет данных и он не является допустимым json.

Вам нужно вернуть результат сетевого вызова из doInBackground() вместо пустой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...