编写简单的代码,但应用程序已停止在Kotlin中的工作

时间:2018-11-04 11:17:06

标签: java android kotlin

我正在尝试学习kotlin语言,对我来说,第一个应用是从json数组获取数据。但是问题是当开始调试应用时,我遇到了致命异常:main和应用已停止工作。在我的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 :(得分:1)

您的library("knitr") library("kableExtra") set.seed(1) data <- data.frame( X = sample(1:10), X2 = sample(1:10), X3 = sample(1:10), X4 = sample(1:10), X5 = sample(1:10) ) pca.data <- princomp(data, cor=TRUE) sum.data <- summary(pca.data) kable(as.data.frame(sum.data)) 总是返回一个空字符串doInBackground()。该空字符串将作为参数传递给"",而后者又将此空字符串用作onPostExecute的参数。当您尝试从此空字符串创建JSON数组时,它将在索引0处引发异常,因为它没有更多数据,并且不是有效的json。

您需要从handleJson返回网络调用的结果,而不是空字符串。

答案 1 :(得分:0)

**

  

像下面的示例一样使用您的代码:

**

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()
        }
    }
}

}