Kotlin Einsteiger

O

ortech

Neues Mitglied
2
hallo,

das ist mein 1. Thread. Hoffe ich bin hier auch richtig.

Programmiere seit vielen Jahren vb.net. Möchte nun jedoch Apps für Android (und später auch IOS) schreiben, das funktioniert mit vb.net nicht. Daher hab ich angefangen mich mit Kotlin zu beschäftigen. Vorgestern um genau zu sein.
Ich quäle mich gerade seit gestern damit in einem Timer, der pro Sekunde aufgerufen wird, um einen Text eines TextView zu ändern. Die Variable money wird pro Timeraufruf um 1 erhöht und soll im TextView txtMoney angezeigt werden.
Leider wird die findViewByID in der Timer Funktion nicht erkannt. Global kann ich die Variable auch nicht deklarieren, das wird nicht zugelassen. Wie mache ich das denn nun? Freue mich über einen Tipp.

LG Alois


package com.example.uyc_android
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import java.util.Timer
import java.util.TimerTask

var money=0


class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val mytxt = findViewById<TextView>(R.id.txtMoney)

}
}


fun main() {
val timer = Timer()
val delay = 1L
val period = 100L

timer.scheduleAtFixedRate(object : TimerTask() {
override fun run() {
// Code, der periodisch ausgeführt werden soll
println("Timer Task is running")
money++
txtMoney.text = money.toString()
mytxt.text= money.toString()
}
}, delay, period)
}
 
@ortech

Leider wird die findViewByID in der Timer Funktion nicht erkannt.
Ich sehe dort kein findViewById
Zumal du Dir bereits eine Instanz zum Layout-TextView in OnCreate ermittelt hast


Zu deiner Loop:
Ich verwende grundsätzlich immer reine Core - Threads um periodisch etwas umzusetzen.
Die Timer-Klasse ist auch für andere Aufgaben angedacht.
Timer | Android Developers


UI Threads :
UI Komponenten können & dürfen NICHT in einem Thread ausgeführt werden , sondern müssen immer im UI Thread bedient werden.
Processes and threads overview | App quality | Android Developers
Activity | Android Developers


Grundsätzlich zu deinem Stil : (println & main)
Das ist leider kein Desktop Programm sondern du musst "umdenken" .
Nutze LogCat (anstatt println) - somit hättest Du schon den Hinweis auf deinen vermeidlichen Fehler bekommen .
Du befindest dich bereits schon in der "main()" Funktion (Activity/onCreate()) , "main" gibt es unter Android nicht.


Möchte nun jedoch Apps für Android (und später auch IOS) schreiben,
Schau dir mal React an
React
 
Zuletzt bearbeitet:
ich habe meinen ersten Code mal umgeschrieben, sodass er grundlegend funktioniert. Ob man so programmiert...keine Ahnung.

package com.example.uyc_android
import android.os.Build
import android.os.Bundle
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import java.util.Timer
import kotlin.concurrent.timerTask

var money=0
var timerperiod: Long= 1000
var computerType=1
var income =1

class MainActivity : AppCompatActivity() {

@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val mytxt = findViewById<TextView>(R.id.txtMoney)
val btnSpeed = findViewById<Button>(R.id.btnSpeed)
val btnUpgrade = findViewById<Button>(R.id.btnUpgrade)
val btnIncome = findViewById<Button>(R.id.btnIncome)
val bild = findViewById<ImageView>(R.id.imagePC)

btnSpeed.setOnClickListener {
timerperiod -= 100L
if (timerperiod <= 100L) {
timerperiod = 100L
}
runOnUiThread { btnSpeed.text = "SPEED ${timerperiod}" }
}

btnUpgrade.setOnClickListener {
computerType++
if (computerType >= 3) {
computerType = 3
}
if (computerType == 1) {
runOnUiThread { bild.setTag(R.drawable.pc1)}
}
if (computerType == 2) {
runOnUiThread { bild.setTag(R.drawable.pc2)}
}
if (computerType == 3) {
runOnUiThread { bild.setTag(R.drawable.pc3)}
}

runOnUiThread { btnUpgrade.text = "UPGRADE ${computerType}" }
}


btnIncome.setOnClickListener {
income++
runOnUiThread { btnIncome.text = "INCOME ${income}" }
}



Timer().schedule(
timerTask
{
runOnUiThread { mytxt.text = money.toString() }
money += income
}, 0L, timerperiod)
}
}


Was nicht funktioniert, ist das Ändern der TimerPeriod, die ich mit dem Button Speed verändere. Irgendwie reagiert der Timer nicht darauf.







Also zu deiner Aussage, es gäbe keine main() mehr stimmt so nicht, ich stolpere immer wieder beim Suchen darüber und auch chatGPTX gibt in Beispielcodes main() aus. Was ist denn der Unterschied zw. main() und mainActivity()?

Bzgl. Timer Klasse hab ich gelesen, dass diese bereits veraltert sein soll und stattdessen ScheduledThreadPoolExecutor verwendet wird. Puh, ganz schön kompliziert im Vgl. zu Visual Studio finde ich.
 
ach ja, und das "Füllen der ImageView mit diversen Bildern, die ich im Recourse MAnager hinzugefügt habe (PC1, PC2, PC3), werden leider auch nicht angezeigt.
 
@ortech

So leid es mir auch tut - so wird das Nichts - und ich begründe dies auf Dein zweites SourcePosting :

a) Bitte KEIN ChatGPT verwenden - das ist völliger Schrott, der da raus kommt , besonders deine Beispiel mit "main()"
Offensichtlich suchst du nicht nach Android Beispielen, sondern Java Beispielen - das sind zwei unterschiedliche Welten

UND Wichtig : ChatGPT ist begrenzt auf 2021 - die API hat sich seit den letzten zwei Jahren nahezu komplett geändert

Daher mein TIPP : Ausschließlich sich der originalen API Documentation bedienen - ohne Diese kommst du nicht zum Ziel.
Documentation | Android Developers Dort sind all Deine Fragen mit Beispielen beantwortet


b)
Bzgl. Timer Klasse hab ich gelesen, dass diese bereits veraltert sein soll und stattdessen ScheduledThreadPoolExecutor verwendet wird.
Dazu habe ich dir extra oben links herausgesucht - warum setzt du das darin Bezeichnete nicht um ?

c)
ach ja, und das "Füllen der ImageView mit diversen Bildern, die ich im Recourse MAnager hinzugefügt habe (PC1, PC2, PC3), werden leider auch nicht angezeigt.
Logisch, denn du hast das Prinzip der AndroidArchitektur leider noch nicht inne.
(runUIThread ist leider an der falschen Stelle verwendet worden - schau dir meine erste Antwort an)
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: jogimuc
dann werd ich chatGPT nicht mehr verwenden.
Deine Antwort ist jetzt keine konkrete Antwort (ich würde da ein Code Beispiel bevorzugen).
Ich habe mir die links angesehen, ich kann zwar etwas englisch, aber das ist mir viel zu hoch geschrieben.
da komm ich nicht weiter. Das setzt zu viel Grundwissen voraus! (Was ist ein Deamon etv).

Kennst du ev. einen guten deutschen Einsteigerkurs auf youtube oder so? Die, die ich mir bisher angesehen haben, geben keinen Überblick über die groben Zusammenhänge...
Beiträge automatisch zusammengeführt:

ach ja und für mich ist Java und auch Android komplettes Neuland. Kotlin ist vereinfachtes Java (soweit ich gelesen habe) und es setzt Java Kenntnisse nicht voraus, oder etwa doch? Natürlich tut man sich leichter, wenn man vorher mit Java sich beschäftigt hat, schon klar. Aber sollte doch auch ohne gehen. Sollte ich mit einem Kotlin Grundkurz, einem Java Grundkurs oder einem Android Grundkurs beginnen? Was ratest du mir?
 
Zuletzt bearbeitet:
Deine Antwort ist jetzt keine konkrete Antwort (ich würde da ein Code Beispiel bevorzugen).
Für ein "Tutorial/Coding" fehlt leider die Zeit in einem Forum , denn die Antworten werden ja in der Freizeit erstellt.
Zumal man für so Etwas ja das Projekt mit allen Dateien und Einstellungen haben müsste und nicht nur Source Fragmente.
Wir können hier nur Tipps geben, "hoppeln" muss man aber schon alleine.


Kennst du ev. einen guten deutschen Einsteigerkurs auf youtube oder so? Die, die ich mir bisher angesehen haben, geben keinen Überblick über die groben Zusammenhänge...
Wir haben hier einmal vor langer Zeit ( teilweise veraltet) ein Tutorial verfasst
[LEITFADEN] Der Einstieg in die Android Programmierung mit Android Studio (Android App Entwicklung)

Ein aktuelles deutsches Tutorial - auch auf Youtube - ist mir nicht bekannt - leider kommt man heutzutage nicht mehr um fundierte Englischkenntnisse vorbei- zumal, wenn diese Videos online sind, sie quasi schon wieder veraltet sind.

Es ändert sich in dieser "Branche" quasi alle 3-4 Monate etwas und eine App - die mal vermeidlich fertig ist - muss spätestens alle 3 Monate auf den neusten Stand gebracht werden. (Egal ob Android oder iOS)
Schau dir mal aus Interesse in der API an ,wieviel Funktionen schon "deprecated" sind und dazu kommen noch die Änderungen der (zwingend benötigten) externen Bibliotheken.





Ein ganz persönlicher Eindruck :

Ich entwickle nun schon seit über 10 Jahren hauptberuflich mobile Apps.
Wenn du jetzt mit der nativen Programmierung anfängst (Kotlin/Java), so würde es schon einige zahlreiche Monate dauern , bis du etwas Rudimentäres verstanden und vor allem stabil umgesetzt hast.

Android ist eine VM und das muss man erst mal ein wenig inne haben .

Das Ganze fängt schon an einem schnöden JSON an , wenn das mal ein wenig größer ist und man es parsen muss.
Das kann man unter Android nur mit äußerst zeitkritischen Tasks / Threads / Callbacks / Listener umsetzen , um die UI nicht zu blockieren. Ich könnte noch X - Beispiele nennen, die einen Desktop nicht die Bohne interessieren , Android/iOS aber schon.



Deshalb habe ich Dir zu React angeraten, solche Plattformen bieten Dir ein wenig Unterstützung, was die Aktualisierung betrifft und auch eher HighLevel sind - aber auch hier sollte man quasi täglich in deren API reinschauen.

Richtige und umfangreiche Apps , die auch performat laufen , kommen an der nativen Entwicklung nicht vorbei - ein großer Teil meiner Apps ist neben Java (30%) in C (70%) geschrieben.
 
Zuletzt bearbeitet:
Tipp für den Einstieg
Inhaltsverzeichnis
Beiträge automatisch zusammengeführt:

ortech schrieb:
Was nicht funktioniert, ist das Ändern der TimerPeriod, die ich mit dem Button Speed verändere. Irgendwie reagiert der Timer nicht darauf.
Das wird auch nicht gehen. So wie es versuchst oder dir denkst.

Du hast denn Teimer einmal gestartet. Danach wird die variable nicht mehr vom Timer abgefragt und benutzt.
Eine Variante wäre den Timer zubeenden und mit der neuen periodendauer wider zu starten.

Ps wie schon gesagt das runonuithraed brauchst du nur im Timertask in den anderen Listenern nicht.
 
Zuletzt bearbeitet:

Ähnliche Themen

D
Antworten
17
Aufrufe
421
datNeMo
D
Helmut1A
  • Helmut1A
Antworten
7
Aufrufe
1.133
Helmut1A
Helmut1A
S
Antworten
0
Aufrufe
594
Sergio13
S
Zurück
Oben Unten