Я пытаюсь собрать значения из данных, сохраненных в sqlite, и значение html, запрошенное jsoup внутри потока, данные sqlite были возвращены, но значения внутри потока, которые доставляют данные со страницы html, не печатались что-нибудь. Почему? это потому, что я не могу отправить значение вне потока? Я создал глобальную переменную вне потока (stringbuilder), чтобы перехватывать данные внутри потока и отправлять вне потока, но также это не сработало, хотя я тестировал эту тему на другой странице (вне файла базы данных) и отлично работает
что не так с этим кодом?
![enter image description here](https://i.stack.imgur.com/BbWqN.png)
DatabaseHandler.kt
fun allInvestments():List<InvestModelClass>{
val invList:ArrayList<InvestModelClass> = ArrayList<InvestModelClass>()
val selectQuery = "SELECT * FROM $TABLE_CONTACTS order by id desc"
val db = this.readableDatabase
var cursor: Cursor?
try{
cursor = db.rawQuery(selectQuery, null)
}catch (e: SQLiteException) {
db.execSQL(selectQuery)
return ArrayList()
}
// var invest_id: Int
var start_date: String
var amount:String
var currency: String
var karat:String
var enter_price:String
var percent:String
//moveToFirst will bring all ids
//moveToLast will bring the last inserted id
if (cursor.moveToFirst()) {
do {
// invest_id = cursor.getInt(cursor.getColumnIndex("id"))
start_date = cursor.getString(cursor.getColumnIndex("dt"))
amount = cursor.getString(cursor.getColumnIndex("amount"))
currency = cursor.getString(cursor.getColumnIndex("currency"))
karat = cursor.getString(cursor.getColumnIndex("karat"))
enter_price = cursor.getString(cursor.getColumnIndex("enter_price"))
if(enter_price.contains("إلى")){
var splitterx="إلى"
val split_strx=enter_price.split(splitterx)
enter_price=split_strx[0]
}else {
var splitterx=" "
val split_strx=enter_price.split(splitterx)
enter_price=split_strx[0]
}
//set percent,new amount
//calculate percent/profit and advice
if(currency=="الجنيه المصرى"){
url_link = "http://egypt.gold-price-today.com/"
}
if(currency=="الريال السعودي"){
url_link = "http://saudi-arabia.gold-price-today.com/"
}
if(currency=="الدرهم الإماراتى"){
url_link = "http://united-arab-emirates.gold-price-today.com/"
}
if(currency=="الدينار الكويتى"){
url_link = "http://kuwait.gold-price-today.com/"
}
//start thread to get current price
var catch_new_amount=StringBuilder()
var catch_percent=StringBuilder()
Thread(Runnable {
var init_recent_price=StringBuilder()
try{
val doc = Jsoup.connect(url_link).get()
val table = doc.select("table")[0]
val tbody = table.select("tbody")
val rows = tbody.select("tr")
for (i in rows.indices) {
val row = rows[i]//
val cols = row.select("td")
//karat 21
if (i == 2 ) {
karat_recent_price = cols[0].text()
if(karat_recent_price.contains("إلى")){
var splitter="إلى"
val split_str=karat_recent_price.split(splitter)
karat_recent_price=split_str[0]
init_recent_price.append(karat_recent_price) //show karat price text
}else {
var splitter=" "
val split_str=karat_recent_price.split(splitter)
karat_recent_price=split_str[0]
init_recent_price.append(karat_recent_price) //show karat price text
}
}
//karat 18
if (i == 3 ) {
karat_recent_price = cols[0].text()
if(karat_recent_price.contains("إلى")){
var splitter="إلى"
val split_str=karat_recent_price.split(splitter)
karat_recent_price=split_str[0]
init_recent_price.append(karat_recent_price) //show karat price text
}else {
var splitter=" "
val split_str=karat_recent_price.split(splitter)
karat_recent_price=split_str[0]
init_recent_price.append(karat_recent_price) //show karat price text
}
}
//karat 24
if (i == 0 ) {
karat_recent_price = cols[0].text()
if(karat_recent_price.contains("إلى")){
var splitter="إلى"
val split_str=karat_recent_price.split(splitter)
karat_recent_price=split_str[0]
init_recent_price.append(karat_recent_price) //show karat price text
}else {
var splitter=" "
val split_str=karat_recent_price.split(splitter)
karat_recent_price=split_str[0]
init_recent_price.append(karat_recent_price) //show karat price text
}
}
//inv_amount[index] , inv_enter_price[index] , karat_recent_price
var int_amount=amount
// new_amount=(int_amount * int_recent_price_string / int_enter_price).toString()
new_amount= karat_recent_price
catch_new_amount.append(new_amount)
if(new_amount > int_amount){
var inc=new_amount.toFloat() - int_amount.toFloat()
var percent_inc=(inc/int_amount.toFloat())* 100
percent=percent_inc.toString()
init_percent_string=percent
catch_percent.append(percent)
}else {
var dec=int_amount.toFloat() - new_amount.toFloat()
var percent_dec=(dec/int_amount.toFloat()) * 100
percent=percent_dec.toString()
init_percent_string=percent
catch_percent.append(percent)
}
}//end for
}
catch(e: IOException){
e.printStackTrace()
}
// runOnUiThread{}
}).start()
//id,start_date,enter_price,amount,currency,karat,percent,profit
val emp= InvestModelClass(
start_date = start_date,
enter_price = enter_price,
amount = amount,
currency = currency,
karat = karat,
new_amount = catch_new_amount.toString(),
percent = catch_percent.toString()
)
invList.add(emp)
} while (cursor.moveToNext())
}
return invList
}
ListInvests.kt
package com.example.parsehtml
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.os.Bundle
import android.view.View
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.list_invests.*
import kotlinx.android.synthetic.main.startinvest_main.*
class ListInvests : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.startinvest_main)
button.setOnClickListener(){
intent = Intent(this,MainActivity::class.java)
startActivity(intent)
}
//creating the instance of DatabaseHandler class
val databaseHandler: DatabaseHandler= DatabaseHandler(this)
//calling the viewEmployee method of DatabaseHandler class to read the records
//id,start_date,enter_price,amount,currency,karat,percent,profit
val inv: List<InvestModelClass> = databaseHandler.allInvestments()
val inv_startdate = Array<String>(inv.size){"0"}
val inv_enter_price = Array<String>(inv.size){"null"}
val inv_amount = Array<String>(inv.size){"null"}
val inv_currency = Array<String>(inv.size){"null"}
val inv_karat = Array<String>(inv.size){"null"}
val inv_new_amount=Array(inv.size){"null"}
val inv_percent=Array(inv.size){"null"}
var index = 0
for(e in inv){
inv_startdate[index] = e.start_date.toString()
inv_enter_price[index] = e.enter_price.toString()
inv_amount[index] = e.amount.toString()
inv_currency[index] = e.currency.toString()
inv_karat[index] = e.karat.toString()
inv_new_amount[index]=e.new_amount.toString()
inv_percent[index]=e.percent.toString()
index++
}
//creating custom ArrayAdapter
//id,start_date,enter_price,amount,currency,karat,percent,profit
val myListAdapter = InvestListAdapter(this,inv_startdate,inv_enter_price,inv_amount,inv_currency,inv_karat,inv_new_amount,inv_percent)
listView.adapter = myListAdapter
}//end oncreate
}
InvestModelClass.kt
package com.example.parsehtml
//id,start_date,enter_price,amount,currency,karat,percent,profit
class InvestModelClass ( val start_date:String ,val enter_price:String, val amount: String,val currency:String,val karat:String,val new_amount:String,val percent:String)