Java 制作简单代码,但应用程序在kotlin中停止工作
我正在尝试学习kotlin语言,我的第一个应用是从json数组获取数据。但问题是,当开始调试应用程序时,l出现了致命的异常:main和应用程序已停止工作。在我的Android应用程序中,我设计了以下json数据结构 我的代码是:Java 制作简单代码,但应用程序在kotlin中停止工作,java,android,kotlin,Java,Android,Kotlin,我正在尝试学习kotlin语言,我的第一个应用是从json数组获取数据。但问题是,当开始调试应用程序时,l出现了致命的异常:main和应用程序已停止工作。在我的Android应用程序中,我设计了以下json数据结构 我的代码是: package com.example.ali.test import android.os.AsyncTask import android.support.v7.app.AppCompatActivity import android.os.Bundle impo
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;
}
}
package com.example.ali.test
导入android.os.AsyncTask
导入android.support.v7.app.AppActivity
导入android.os.Bundle
导入kotlinx.android.synthetic.main.activity\u main*
导入kotlinx.android.synthetic.main.activity\u main.view*
导入org.json.JSONArray
导入org.json.JSONObject
导入java.io.BufferedReader
导入java.io.InputStream
导入java.io.InputStreamReader
导入java.net.HttpURLConnection
导入java.net.URL
类MainActivity:AppCompatActivity(){
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val url=”https://mysafeinfo.com/api/data?list=presidents&format=json"
下载().execute(url)
}
//json api的完整类
内部类下载:AsyncTask(){
覆盖乐趣onPreExecute(){
}
//用于构建连接
重写fun doInBackground(vararg p0:String?:String){
试一试{
val url=url(p0[0])
val urlConnect=url.openConnection()作为HttpURLConnection
urlConnect.connectTimeout=700
val inputStream=urlConnect.inputStream
val dataJsonAsStr=covertStreamToString(urlConnect.inputStream)
出版进度(dataJsonAsStr)
}捕获(e:例外){
}
返回“”
}
//用于从json api获取项目
重写进程更新(vararg值:字符串?){
}
重写onPostExecute(结果:字符串?){
super.onPostExecute(结果)
handleJson(结果)
}
}
有趣的handleJson(jsonString:String?){
val jsonArray=jsonArray(jsonString)
val list=ArrayList()
变量x=0
而(x
控制台中的错误:
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)
E/AndroidRuntime:致命异常:主
进程:com.example.ali.test,PID:24738
java.lang.RuntimeException:java.lang.reflect.InvocationTargetException
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
原因:java.lang.reflect.InvocationTargetException
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1496)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
由以下原因引起:org.json.JSONException:的字符0处输入结束
位于org.json.JSONTokener.syntaxError(JSONTokener.java:449)
位于org.json.JSONTokener.nextValue(JSONTokener.java:97)
位于org.json.JSONArray(JSONArray.java:92)
位于org.json.JSONArray(JSONArray.java:108)
位于com.example.ali.test.MainActivity.handleJson(MainActivity.kt:68)
在com.example.ali.test.MainActivity$Download.onPostExecute上(MainActivity.kt:59)
在com.example.ali.test.MainActivity$Download.onPostExecute上(MainActivity.kt:27)
位于android.os.AsyncTask.finish(AsyncTask.java:660)
位于android.os.AsyncTask.-wrap1(AsyncTask.java)
在android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677)中
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6776)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1496)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
有人知道吗 您的doInBackground()
总是返回一个空字符串,“
”。此空字符串将作为参数传递给onPostExecute
,后者反过来将此空字符串用作handleJson
的参数。当您尝试从这个空字符串创建JSON数组时,它在索引0处抛出一个异常,因为它没有更多的数据,并且不是有效的JSON
您需要从doInBackground()
返回网络调用的结果,而不是空字符串。**
使用如下示例所示的代码:
**
class MainActivity:AppCompatActivity(){
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val s=tvDisplay.text.toString()
btnOk.setOnClickListener{
下载()。执行
}
}
内部类下载:AsyncTask(){
覆盖乐趣doInBackground(vararg ss:String?):Void{
验证(ss[0]!!)
返回空
}
}
私人娱乐验证(s:字符串){
如果(s.isNotEmpty()){
runOnUiThread{
Toast.makeText(这是“Working:)”,Toast.LENGTH\u SHORT.show()
}
}
其他的
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()
}
}
}