Create thread


#1

Hi, I’m trying to create a thread, I wrote this code but when the thread starts the application stop. How can I fix?
package com.example.matteoarcangeli.tesina

import java.io.BufferedInputStream
import java.net.HttpURLConnection
import java.net.URL

class Macchinetta(var cmd: String) : Thread() {
    
    init {
        run()
        super.start()
    }

    override fun run() {
        val urlConnection = URL("http://192.168.4.1" + '/'.toString() + cmd).openConnection() as HttpURLConnection
        try {
            val inp = BufferedInputStream(urlConnection.inputStream)
            inp.close()
        } finally {
            urlConnection.disconnect()
        }
    }


}

#2

Why don’t you just use the thread() function?

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/thread.html

Also, what does it mean that the application stops, does it crash or just closes?
Maybe it prints something that can help understand what exactly is happening?


#3

Sorry, application stop means that it crash


#4

Also in in this way the thread will execute but then application crash

  Thread({
                    val urlConnection = URL("http://192.168.4.1" + '/'.toString() + cmd).openConnection() as HttpURLConnection
                    try {
                        val inp = BufferedInputStream(urlConnection.inputStream)
                        inp.close()
                    } finally {
                        urlConnection.disconnect()
                    }
                }).start()

#5

What message is shown when the application crashes?


#6

By the way, do not call run() from init, because it should be called automatically from start() method.


#7

I solved in this way: I create a thread in the mainactivity, but when I swichon accelerometer app crash

class MainActivity : AppCompatActivity(), SensorEventListener {
    private lateinit var sensorManager: SensorManager
    private lateinit var swAccellerometro: Switch
    private lateinit var txtAccellerometo: TextView
    private lateinit var car: Car



    var background = object : Thread(){
        override fun run() {
            car = Car(URL("http://192.168.4.1"))
        }
    }.start()
    

    override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {


    }

    @SuppressLint("SetTextI18n")
    override fun onSensorChanged(event: SensorEvent?) {
        if (swAccellerometro.isChecked) {

            val x = event!!.values[0]
            val y = event.values[1]
            val z = event.values[2]

            if (abs(x) > 0.25 || abs(z) > 0.25) {
                txtAccellerometo.text = fromHtml("<p><b>x: </b> $x</p><p><b>y: </b> $y</p><p><b>z: </b> $z</p>", FROM_HTML_MODE_LEGACY)
                when {
                    x>0.25 -> car.muovi("right")
                  /* (x < 0.25 && x > -0.25) || (x > -0.7 && z < -0.25) -> car.muovi("stop")
                    x > 0.25 -> car.muovi("right")
                    x < -0.25 -> car.muovi("left")
                    z < -0.7 -> car.muovi("forward")
                    z > -0.25 -> car.muovi("backward")*/
                }
            }

        } else
            txtAccellerometo.text = "Accellerometro disabilitato"
    }


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

        sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL)

        swAccellerometro = findViewById(swAcc)
        txtAccellerometo = findViewById(R.id.textView)


        findViewById<View>(R.id.btnAvanti).setOnClickListener {
            car.muovi("forward")
        }

        findViewById<View>(R.id.btnIndietro).setOnClickListener {
            car.muovi("backward")
        }

        findViewById<View>(R.id.btnDestra).setOnClickListener {
            car.muovi("right")
        }

        findViewById<View>(R.id.btnSinistra).setOnClickListener {
            car.muovi("left")
        }

        findViewById<View>(R.id.btnStop).setOnClickListener {
            car.muovi("stop")
        }
    }
}

class Car(private var url:URL) {

    fun muovi(cmd: String) {
        val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()
        StrictMode.setThreadPolicy(policy)

            val urlConnection = URL(url.toString() + '/' + cmd).openConnection() as HttpURLConnection
            try {
                val inp = BufferedInputStream(urlConnection.inputStream)
                inp.close()
            } catch (e: Exception) {
                e.printStackTrace()
            } finally {
                urlConnection.disconnect()
            }
    }

}