App arbeitet sehr langsam

  • Antworten:30
Evoh
  • Forum-Beiträge: 29

04.03.2014, 21:47:46 via Website

Hey Entwickler ;),

ich habe ein kleines Anfänger Problem meine App läuft immer ziemlich langsam, wenn ich einen Button drücke, der ein FrameLayout Visible setzt.
Warum wird die App dann so langsam?

Hier mal mein Code^^

1public class MainActivity extends Activity implements OnClickListener{
2
3 private Button shop;
4 private Button back;
5 private TextView tv1;
6 private TextView tv2;
7 private TextView tv3;
8 private FrameLayout Frame;
9 private ImageView click;
10 private int level1 = 1;
11 private int level2 = 1;
12 private int level3 = 1;
13 private double count;
14 private double countps;
15 private double zaehler1;
16 private double zaehler2;
17 private double zaehler3;
18
19
20 @Override
21 protected void onCreate(Bundle savedInstanceState) {
22 super.onCreate(savedInstanceState);
23 setContentView(R.layout.activity_main);
24 click = (ImageView) findViewById(R.id.imageView1);
25 click.setOnClickListener(this);
26 Framesho = (FrameLayout) findViewById(R.id.Frame);
27 shop = (Button) findViewById(R.id.shop);
28 shop.setOnClickListener(this);
29 back = (Button) findViewById(R.id.back);
30 back.setOnClickListener(this);
31
32 tv1 = (TextView) findViewById(R.id.textView1);
33 tv2 = (TextView) findViewById(R.id.textView2);
34 tv3 = (TextView) findViewById(R.id.textView3);
35
36 LoadPreferences();
37 aktualisieren();
38 starteCount();
39 }
40
41
42
43 @Override
44 public void onClick(View v) {
45
46 if(v.getId() == R.id.tele) {
47
48 Frame.setVisibility(View.VISIBLE);
49
50 }
51
52 if(v.getId() == R.id.back) {
53
54
55 Frame.setVisibility(View.GONE);
56
57
58 }
59
60 if(v.getId() == R.id.imageView1) {
61
62 count = count + 1.0;
63 aktualisieren();
64
65 }
66
67 if(v.getId() == R.id.imageView2) {
68 if(count >= (int) Math.pow(1.2, level1)*2) {
69 count = count - (Math.pow(1.2, level1)*2);
70 zaehler1 = zaehler1 + Math.round(0.1*10)/10d;
71
72 level1 = level1 + 1;
73 aktualisieren();
74 }
75 }
76
77 if(v.getId() == R.id.imageView3) {
78 if(count >= Math.pow(1.2, level2)*10) {
79 count = count - Math.pow(1.2, level2)*10;
80 zaehler2 = zaehler2 + 0.5;
81 level2 = level2 + 1;
82 aktualisieren();
83 }
84 }
85
86 if(v.getId() == R.id.imageView4) {
87 if(count >= Math.pow(1.2, level3)*50) {
88 count = count - Math.pow(1.2, level3)*50;
89
90 zaehler3 = zaehler3 + 5.0;
91 level3 = level3 + 1;
92 aktualisieren();
93
94 }
95 }
96 round();
97 countps = zaehler1 + zaehler2 + zaehler3;
98 countps = Math.round(countps*10)/10d;
99 aktualisieren();
100 round();
101 }
102
103private void starteCount()
104{
105 new Thread(new Runnable() {
106 public void run(){
107
108 Count();
109
110
111 }
112}).start();
113
114}
115private void Count() {
116 Timer timer = new Timer();
117 TimerTask task = new TimerTask() {
118 public void run(){
119 MainActivity.this.runOnUiThread(new Runnable() {
120 public void run() {
121
122
123 count = count + countps;
124 round();
125 aktualisieren();
126
127
128
129 }
130 });
131 }
132 };
133
134 timer.schedule(task, 0, 1000);
135
136 }
137public void round(){
138 count = Math.round(count * 10)/10d;
139}
140
141
142 public void aktualisieren(){
143 TextView countps = (TextView) findViewById(R.id.countps);
144 countps.setText(Double.toString(countps) + " countps");
145 TextView Count = (TextView) findViewById(R.id.Count);
146 Count.setText(Double.toString(count) + " Count");
147 writeSavedPreferences();
148
149 tv1.setText(Integer.toString( (int) ( Math.pow(1.2, level1)*2)));
150 tv2.setText(Integer.toString( (int) ( Math.pow(1.2, level2)*10)));
151 tv3.setText(Integer.toString( (int) ( Math.pow(1.2, level3)*50)));
152
153 }
154
155 private void writeSavedPreferences() {
156 SharedPreferences settings = getSharedPreferences("GAME", 0);
157 SharedPreferences.Editor editor = settings.edit();
158
159 editor.putInt("Level1", level1);
160 editor.putInt("Level2", level2);
161 editor.putInt("Level3", level3);
162 editor.putString("countps", countps + "");
163 editor.putString("count", count + "");
164 editor.putString("zaehler1", zaehler1 + "");
165 editor.putString("zaehler2", zaehler2 + "");
166 editor.putString("zaehler3", zaehler3 + "");
167 editor.commit();
168
169
170 }
171
172 private void LoadPreferences() {
173 SharedPreferences pref = getSharedPreferences("GAME", 0);
174
175
176 level1 = pref.getInt("Level1", level1);
177 level2 = pref.getInt("Level2", level2);
178 level3 = pref.getInt("Level3", level3);
179 countps = Double.parseDouble(pref.getString("countps", countps + "")) ;
180 count = Double.parseDouble(pref.getString("count", count + ""));
181 zaehler1 = Double.parseDouble(pref.getString("zaehler1", zaehler1 + ""));
182 zaehler2 = Double.parseDouble(pref.getString("zaehler2", zaehler2 + ""));
183 zaehler3 = Double.parseDouble(pref.getString("zaehler3", zaehler3 + ""));
184 }
185 }

— geändert am 05.03.2014, 16:26:54

Antworten
Michele
  • Forum-Beiträge: 1.525

04.03.2014, 22:16:03 via Website

Hallo.

Testet du deine App auf dem Phone oder Emulator?
Wenn auf dem Phone, welches hast du?


LG

Antworten
Evoh
  • Forum-Beiträge: 29

04.03.2014, 22:33:33 via Website

Hey

Ich teste übers Smartphone (Huawei Ascemd P6). Alsso vorher hatte ich nie Probleme. Das passiert immer erst wenn ich das Layout visible mache, wenn es wiedergone ist läuft die App wieder flüssig.


Danke schonmal für die schnelle Antwort :)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.03.2014, 22:34:57 via Website

Wieviel Ram und Speicherplatz brauch die App?
Ist das Layout so kompliziert?
poste es bittte mal.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Michele
  • Forum-Beiträge: 1.525

04.03.2014, 22:37:04 via Website

Was soll denn deine App bewirken, wenn ich fragen darf.

Vielleicht kann man es anders dann machen das es nicht mehr hängt/langsam ist.


LG

Antworten
Evoh
  • Forum-Beiträge: 29

05.03.2014, 16:26:38 via Website

Pascal P.
Wieviel Ram und Speicherplatz brauch die App?
Ist das Layout so kompliziert?
poste es bittte mal.

1<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:gravity="top"
6 android:paddingBottom="@dimen/activity_vertical_margin"
7 android:paddingLeft="@dimen/activity_horizontal_margin"
8 android:paddingRight="@dimen/activity_horizontal_margin"
9 android:paddingTop="@dimen/activity_vertical_margin"
10 tools:context=".MainActivity" >
11
12 <LinearLayout
13 android:id="@+id/linearLayout1"
14 android:layout_width="wrap_content"
15 android:layout_height="wrap_content"
16 android:layout_alignParentRight="true"
17 android:layout_alignParentTop="true" >
18
19 <Button
20 android:id="@+id/button4"
21 android:layout_width="29dp"
22 android:layout_height="203dp"
23 android:text="Button" />
24
25 <Button
26 android:id="@+id/button3"
27 android:layout_width="29dp"
28 android:layout_height="203dp"
29 android:text="Button" />
30
31 <Button
32 android:id="@+id/button2"
33 android:layout_width="29dp"
34 android:layout_height="205dp"
35 android:text="Button" />
36 </LinearLayout>
37
38 <TextView
39 android:id="@+id/CPS"
40 android:layout_width="wrap_content"
41 android:layout_height="wrap_content"
42 android:layout_alignBaseline="@+id/Count"
43 android:layout_alignBottom="@+id/Count"
44 android:text="@string/backgroundLayout" />
45
46 <TextView
47 android:id="@+id/Count"
48 android:layout_width="wrap_content"
49 android:layout_height="wrap_content"
50 android:layout_below="@+id/linearLayout1"
51 android:layout_marginLeft="56dp"
52 android:layout_marginTop="114dp"
53 android:layout_toRightOf="@+id/CPS"
54 android:text="@string/backgroundLayout" />
55
56 <ImageView
57 android:id="@+id/imageView1"
58 android:layout_width="200dp"
59 android:layout_height="205dp"
60 android:layout_alignParentLeft="true"
61 android:layout_alignTop="@+id/linearLayout1"
62 android:layout_marginTop="20dp"
63 android:src="@drawable/klunbe" />
64
65 <Button
66 android:id="@+id/shop"
67 android:layout_width="wrap_content"
68 android:layout_height="wrap_content"
69 android:layout_alignParentBottom="true"
70 android:layout_centerHorizontal="true"
71 android:layout_marginBottom="28dp"
72 android:text="@string/buttt" />
73
74 <FrameLayout
75 android:id="@+id/Frame"
76 android:layout_width="wrap_content"
77 android:layout_height="wrap_content"
78 android:layout_alignLeft="@+id/CPS"
79 android:layout_alignParentBottom="true"
80 android:layout_alignParentRight="true"
81 android:layout_alignTop="@+id/linearLayout1"
82 android:visibility="gone" >
83
84 <LinearLayout
85 android:layout_width="match_parent"
86 android:layout_height="match_parent"
87 android:orientation="vertical" >
88
89 <RelativeLayout
90 android:layout_width="wrap_content"
91 android:layout_height="156dp" >
92
93 <ImageView
94 android:id="@+id/imageView3"
95 android:layout_width="wrap_content"
96 android:layout_height="wrap_content"
97 android:layout_alignParentBottom="true"
98 android:src="@drawable/unbeka" />
99
100 <TextView
101 android:id="@+id/textView1"
102 android:layout_width="wrap_content"
103 android:layout_height="wrap_content"
104 android:layout_alignParentLeft="true"
105 android:layout_centerVertical="true"
106 android:layout_marginLeft="34dp"
107 android:text="TextView"
108 android:textColor="#0000ff" />
109
110 </RelativeLayout>
111
112 <RelativeLayout
113 android:layout_width="wrap_content"
114 android:layout_height="159dp" >
115
116 <ImageView
117 android:id="@+id/imageView2"
118 android:layout_width="wrap_content"
119 android:layout_height="wrap_content"
120 android:layout_alignParentBottom="true"
121 android:src="@drawable/unbeka" />
122
123 <TextView
124 android:id="@+id/textView2"
125 android:layout_width="wrap_content"
126 android:layout_height="wrap_content"
127 android:layout_alignParentLeft="true"
128 android:layout_centerVertical="true"
129 android:layout_marginLeft="37dp"
130 android:text="TextView"
131 android:textColor="#0000ff" />
132
133 </RelativeLayout>
134
135 <RelativeLayout
136 android:layout_width="match_parent"
137 android:layout_height="wrap_content"
138 android:layout_weight="0.56" >
139 <ImageView
140 android:id="@+id/imageView4"
141 android:layout_width="wrap_content"
142 android:layout_height="wrap_content"
143 android:src="@drawable/unbeka" />
144 <TextView
145 android:id="@+id/textView3"
146 android:layout_width="wrap_content"
147 android:layout_height="wrap_content"
148 android:layout_alignParentLeft="true"
149 android:layout_centerVertical="true"
150 android:layout_marginLeft="32dp"
151 android:text="TextView"
152 android:textColor="#0000ff" />
153 </RelativeLayout>
154 <Button
155 android:id="@+id/back"
156 android:layout_width="wrap_content"
157 android:layout_height="wrap_content"
158 android:layout_marginLeft="72dp"
159 android:text="@string/back" />
160 </LinearLayout>
161 </FrameLayout>
162</RelativeLayout>

und joa also das Problem tritt erst auf, seitdem ich das Framelayout eingebaut habe bzw. dieses Visible bzw. Gone gestellt habe. Gibt es eine bessere Lösung, damit sozusagen auf dem alten Layout ein neues geöffnet wird?

bzw. es ist ja doch schon ziemlich lang gibt es eine Möglichkeit, dass noch zu minimieren?

— geändert am 05.03.2014, 16:27:59

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.03.2014, 16:43:06 via Website

Da hab ich keine Ahnung.
Für was brauchst du denn das FrameLayout?
Und wie bindest du es ein, vlt liegt da ja der Fehler

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Michele
  • Forum-Beiträge: 1.525

05.03.2014, 16:45:49 via Website

Nimm doch:
android:visibility="gone"
raus und mach es im Code?
Und dann nehme doch lieber "invisible" anstatt "gone".


LG

Antworten
Evoh
  • Forum-Beiträge: 29

05.03.2014, 17:31:29 via Website

Hmmm hilf auch nicht.

Liegt das dadran, dass ich im Hintergrund bzw. im anderen Layout, das unter dem Framelayout liegt, noch Buttons mit Onclick habe? Also,dass die irgendwie kollidieren, weil ja ein Bild darüber liegt.

— geändert am 05.03.2014, 17:47:06

Antworten
Michele
  • Forum-Beiträge: 1.525

05.03.2014, 18:29:17 via Website

Du hast mir ja auch noch immer nicht meine frage beantwortet.
Was genau deine App bewirken soll.

Vielleicht geht das alles viel leichter und anders.


LG

Antworten
Evoh
  • Forum-Beiträge: 29

05.03.2014, 19:06:31 via Website

Oh das hab ich überlesen :cold:

Also ich will eine App machen, die einen Count hat, der sich jede Sekunde um 1 erhöht. Mit diesen Counts soll man sich etwas kaufen können upgrades oder ähnliches. Diesen Upgrade-Shop habe ich versucht mit diesem FrameLayout darzustellen, nur im Hintergrund soll weitergezählt werden. Joa das war es erstmal grob.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.03.2014, 19:15:28 via Website

Tut es auch, wenn du das hochzählen in einen Thread verlegst und den Shop in eine Art PopUp ( so etwas: http://androidresearch.wordpress.com/2012/05/06/how-to-create-popups-in-android/ ) packst.
Somit läuft das Zählen im Hintergrund Weiter und du kannst den Shop in ruhe benutzen. Bei diesem Verfahren musst du aber darauf achten, dass die Zähler variablen zum Zeitpunkt des Abrufs synchron mit den Thread ist.

— geändert am 05.03.2014, 19:15:41

LG Pascal //It's not a bug, it's a feature. :) ;)

Evoh

Antworten
Evoh
  • Forum-Beiträge: 29

05.03.2014, 19:45:44 via Website

AH okay PopUp ;) hatte das vorher auch schon in einer xml wusste aber nicht wie ich das da machen sollte, aber ich versuch es mal so.

und den Thread hab ich ja bereits eingebaut.

Antworten
Michele
  • Forum-Beiträge: 1.525

05.03.2014, 19:59:03 via Website

Hat Pascal P. gut erklärt.

Würde ich auch so machen.
Versuch es mal so.
Ansonsten fragste nochmal, wenn was nicht klappt.


LG

Antworten
Andreas S.
  • Forum-Beiträge: 76

05.03.2014, 20:15:00 via App

Versuche so wenig views wie möglich zu verwenden (besonders bei Verwendung von layout_weight.Bei einer erweiterten Hierarchie wird das sehr performancelastig). Wenn du das Layout auf visible setzt, dann wird die komplette layout Hierarchie durchlaufen.
Durch den Aufruf von runOnUiThread im TimerTask läuft die komplette Berechnung im Ui Thread ab, also jede Sekunde. Ich glaube wenn du das layout einfach weniger komplex gestaltest dann sollte es mehr oder weniger normal laufen

Antworten
Evoh
  • Forum-Beiträge: 29

06.03.2014, 16:15:45 via Website

Okay das mit dem Popup Fenster sieht jetzt schonmal sehr gut aus ;) , aber auch das PopUp -Fenster öffnet sich ziemlich langsam :(

Ich habe jetzt herausgefunden, dass es an den Bilder liegt, die ich in das ImageView gepackt habe. Gibt es dort bestimmte vorgaben, wie groß das Bild und auch die MB/KB größe seindarf?



Kann mir jmd sagen, wie ich das PopUp Fenster je nach Handy bzw. Auflösung wählen kann? Ist das überhaupt mit einem Pop Up möglich, weil das wäre dann ja diese Zeile:
1popupwindo = new PopupWindow(layout, 600, 900, true);
2popupwindo.showAtLocation(layout, Gravity.CENTER, 0, 50);

— geändert am 06.03.2014, 16:37:38

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.03.2014, 16:30:22 via Website

Dort giebst du einfach nur die Grüße des PopUps an, wenn es Fullscreen sein soll, dann musst du noch die Display Szize preüfen.
Sonst kannst du auch den Größen wert errechen, da er ja variabel sein muss.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Evoh
  • Forum-Beiträge: 29

06.03.2014, 21:39:10 via Website

Hey...

danke jetzt funktioniert es so wie ich es will :)

Aber da hab ich gleich wieder eine neue Frage >.<

Ist es möglich den Thread bzw. die App anzuhalen, sodass nicht weitergezählt wird, wenn die App "minimiert" oder der Bildschirm schwarz wird?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.03.2014, 21:42:47 via Website

Jo, du musst dir eine art dafür überlegen, und dann den thrad beenden und den counter speichern. Thread neustarten und dann weiterzählen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Evoh
  • Forum-Beiträge: 29

06.03.2014, 22:10:43 via Website

hmmm kann man diese Beiden zustände irgendwie abfragen oder ähnliches?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.03.2014, 22:22:43 via App

Hattest du nicht schon eine Pausefunktion?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Evoh
  • Forum-Beiträge: 29

06.03.2014, 22:38:25 via Website

Nein hatte ich nicht. Sollte ich? Bis jetzt brauchte ich ja keine Pause.

Ist es denn irgendwie möglich den Zustand der App bzw des Displays auszulesen?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 01:29:07 via App

Ne sorry hatte ich verwechselt.
Hmm, ja aber das kannst du auch googln das würde ich auch machen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Evoh
  • Forum-Beiträge: 29

07.03.2014, 09:36:38 via Website

Okay also ich werde es jetzt mal mit einem Broadcastreciever versuchen.
Dort gibt es ja diese beiden "Infos" für Bildschirm an bzw aus.
ACTION_SCREEN_ON
ACTION_SCREEN_OFF

Kennt jmd diese für den Status App "minimiert?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 10:11:51 via App

ich glaube dafür gibts kein broadcast status. Minimiert wid nach der Funktion
onPause

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Michele
  • Forum-Beiträge: 1.525

07.03.2014, 18:33:52 via Website

Ich verstehe nicht wo nun dein Problem ist oder was genau du willst.

1ACTION_SCREEN_ON
2ACTION_SCREEN_OFF
Das ist dafür da, wenn du dein Screen einschaltest/ausschaltest, dann wird das alles gemacht, was du in dieser Methode drin hast.
Also wenn du dein Screen ausschaltest, dann könnte alles gestoppt werden z.B.

LG

Antworten
Evoh
  • Forum-Beiträge: 29

07.03.2014, 22:32:46 via Website

1Thread Thread;
2
3private void starteCount()
4{
5 Runnable r = new Runnable() {
6 public void run(){
7 Count();
8 }
9 };
10 Thread = new Thread(r);
11 Thread.start();
12}
13
14@Override
15protected void onPause(){
16 super.onPause();
17 Thread.interrupt();
18 }
19
20@Override
21protected void onResume(){
22 super.onResume();
23 if(Thread.isInterrupted()){
24 Thread.start();
25
26
27 }
28 }
29
30Timer time;
31private void Count() {
32 time = new Timer();
33 TimerTask task = new TimerTask() {
34 public void run(){
35 MainActivity.this.runOnUiThread(new Runnable() {
36 public void run() {
37
38 count= count+ cps;
39 round();
40 aktualisieren();
41 }
42 });
43 }
44 };
45
46 time.schedule(task, 0, 1000);
47
48 }

Ich steh grad ein wenig auf Schlauch :bored:

und zwar habe ich mich grad mal an der onPause und onResume Methoden versucht. Also ich habe jetzt ja in der onPause, das der Thread "interrupted werden soll, wenn es "Pausiert" wird. Nur wenn ich das jetzt mache läuft der Count troztdem weiter. Jetzt könnte ich ja noch time.cancel(); machen damit auch der Timer gestoppt wird oder? Nur wenn ich das mache dann muss ich diesen ja auch wieder starten, was wiederum auch nicht funktioniert. Also in der onResume() habe ich ja eigentlich den Thread wieder gestarte von daher sollte der Timer dann ja auch wieder laufen oder mach ich gerade einen Denkfehler?

Antworten
Michele
  • Forum-Beiträge: 1.525

07.03.2014, 22:39:24 via Website

Hallo.

Mach es lieber in der onStop() anstatt onPause().
Weil onPause() wird komischerweise gleich aufgerufen, wenn deine App Startet.
Sehen kannst du es z.B mit einem Toast.

1Toast.makeText(this, "Stop", Toast.LENGTH_SHORT).show();
Packe den in onPause() und du siehst es wird beim App Start schon aufgerufen.
Deswegen lieber onStop().

Und in onResume() ist alles ok.

EDIT: Bisschen unübersichtlicher Code.
Warum ein Thread Extra und dann nochmal ein Timer mit TimerTask drin?
Schreibe es doch einfacher und sauberer.

So ist z.B ein Timer mit TimerTask viel sauberer und einfacher:
1Timer timer = new Timer();
2 timer.scheduleAtFixedRate(new TimerTask() {
3 @Override
4 public void run() {
5
6
7
8
9 }
10 },0,1000);

LG

— geändert am 07.03.2014, 22:47:16

Evoh

Antworten
Evoh
  • Forum-Beiträge: 29

07.03.2014, 23:04:22 via Website

Ja den Code muss ich nochmal ein wenig bereinigen ;)

Nur leider funktioniert es immer noch nicht so richtig. Die onStop Methodehabe ich jetzt eingebaut. Nur der Count läuft trotz gestopptem Thread weiter, obwohl ich weiß, dass die Funktioniert. Muss ich den Timer auch stoppen bzw. anhalten?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.03.2014, 23:07:44 via Website

Ja, das ist doch der sinn. Timer halten sich nicht von allein an :)

LG Pascal //It's not a bug, it's a feature. :) ;)

Evoh

Antworten
Michele
  • Forum-Beiträge: 1.525

07.03.2014, 23:08:30 via Website

Deswegen.
Wozu denn einen Extra Thread. Es reicht der Timer mit TimerTask.
Dadrin haste ja deinen runOnUiThread dann.


LG

— geändert am 07.03.2014, 23:10:23

Evoh

Antworten