Ich bin ein absoluter Anfänger in Java und habe ein einfaches Java-Android-Snippet erstellt, wo ich in einem Runable nach 1,5 Sekunden den TextView
von Hello World
zu Hola Mundo
ändere. Es funktioniert einwandfrei, im Grunde ein WeakReference
sollte verhindern, dass dieses Speicherleck richtig passiert? Ich habe Zweifel, ob es bei der Geräteausrichtung überhaupt keinen Speicherverlust gibt. Ich würde das gerne überprüfen, aber es gelingt mir nicht, die Ausrichtung in meinem emulierten Android zu ändern.Kann dieses Runnable vor Speicherverlust geschützt werden?
Dies ist der Code:
package com.example.helloworld;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
import android.util.Log;
import java.lang.ref.WeakReference;
public class HelloWorldActivity extends Activity
{
private Handler h = new Handler();
private static TextView txtview;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txtview = (TextView) findViewById(R.id.mainview);
h.postDelayed(new WeakRunnable(txtview),1500);
}
private static final class WeakRunnable implements Runnable {
private final WeakReference<TextView> mtextview;
protected WeakRunnable(TextView textview){
mtextview = new WeakReference<TextView>(textview);
}
@Override
public void run() {
TextView textview = mtextview.get();
if (textview != null) {
txtview.setText("Hola Mundo");
textview = null; // No idea if setting to null afterwards is a good idea
}
Log.d("com.example.helloworld", "" + textview);
}
}
}
EDIT
Aus Speicherlecks sicher ist, aber ein paar Antworten wurden auch mit UI-Thread Sperrung betroffen. Tatsächlich führt dieser Code den Handler im Hauptthread aus. Um einen neuen Thread zu erzeugen Ich Laichen einen Thread manuell wie folgt:
package com.example.helloworld;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
import android.util.Log;
import java.lang.ref.WeakReference;
public class HelloWorldActivity extends Activity
{
private static TextView txtview;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txtview = (TextView) findViewById(R.id.mainview);
Thread t = new Thread(new WeakRunnable(txtview));
t.start();
}
private static final class WeakRunnable implements Runnable {
private final WeakReference<TextView> mtextview;
protected WeakRunnable(TextView textview){
mtextview = new WeakReference<TextView>(textview);
}
@Override
public void run() {
TextView textview = mtextview.get();
if (textview != null) {
/*
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
*/
txtview.setText("Hola Mundo");
textview = null;
}
Log.d("com.example.helloworld", "" + Thread.currentThread().getName()); // Outputs "Thread-<num>" if not running on UI thread
}
}
}
Das Problem ist jetzt, dass ich kann nicht scheinen, um die erzeugte Thread in irgendeiner Weise zu verzögern, sonst funktioniert es.
Dies:
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
macht die App selbst verlassen und ich nicht, warum. Irgendetwas sagt mir, dass ich es auf die falsche Art verzögere.
EDIT2
Dank der Verbindung @EugenMatynov mir geben: update ui from another thread in android ich verstanden, warum die App verlassen. Es kommt alles auf den Grund Sie können UI-Methoden nicht von anderen Threads als dem Hauptthread aufrufen. und es ist eine schlechte Übung, die Benutzeroberfläche von einem anderen Thread zu aktualisieren.
sauber die Handlers Warteschlange auf OnPause, und Sie sind 100% leckfrei. In diesem Fall. – Blackbelt
Gibt es aufgrund des statischen TextView-Felds keinen Speicherverlust? – stevehs17