W
WolfCH
Ambitioniertes Mitglied
- 1
Hallo Zusammen
Ich bin bisher nun gut vorangekommen.
Habe einen AsyncTask im Hintergrund welcher aus dem Internet ein Bild lädt und in einer ImageView anzeigt. Nun möchte ich dass dieses alle 30 Sekunden automatisch neu geladen und angezeigt wird, gleichzeitig soll ein TextView z.B. bei 30 Sek beginnen und immer 1 Weniger zählen und bei 0 wenn die 30sek durch sind das Bild neu geladen werden und auch TextView wieder auf 30 setzen.
Ich versuchte das ganze nun mit einem Timer, es will aber noch nicht so recht:
Der AsyncTask sieht folgendermassen aus:
Beim Setzen des TextViews stürzt die App ab.
Logcat sagt:
Geht das so überhaupt? Fehlermeldung selbst bei der Compilierung erhalte ich keine.
Bin froh für Ansätze.
Anmerkdung: Das ganze läuft in einer Activity mit Fragmente, im Fragment wurde ein neues Layout gealden (fragment_bo) in dessem sich die TextViews und ImageViews befinden. else if(number == 3) leitet vom Slidemenu ab, wenn Position 3 gewählt wurde.
Lasse ich die Timer weg und das Bild anzeigen, d.h. AsyncTask nur einmal ausführen dann klappts, aber alle 30sek geht nich.
EDIT:
Ich hab jetzt das mit dem setText und TextView (Timer für 1sek) auskommentiert und den 30sek belassen.
Kein Absturz mehr, das Bild wird korrekt alle paar Sekunden aktualisiert, nur das mit Textview klappt noch nicht.
Danke schon jetzt für die Anregungen.
Grüsse aus der Schweiz
Ich bin bisher nun gut vorangekommen.
Habe einen AsyncTask im Hintergrund welcher aus dem Internet ein Bild lädt und in einer ImageView anzeigt. Nun möchte ich dass dieses alle 30 Sekunden automatisch neu geladen und angezeigt wird, gleichzeitig soll ein TextView z.B. bei 30 Sek beginnen und immer 1 Weniger zählen und bei 0 wenn die 30sek durch sind das Bild neu geladen werden und auch TextView wieder auf 30 setzen.
Ich versuchte das ganze nun mit einem Timer, es will aber noch nicht so recht:
PHP:
else if(number == 3)
{
//Rufe neues Layout auf
final View boView = inflater.inflate(R.layout.fragment_bo, container, false);
//TextView initalisiern und Text setzen
TextView textViewBo = (TextView) boView.findViewById(R.id.bo_text);
final TextView textViewInterval = (TextView) boView.findViewById(R.id.interval);
textViewBo.setText("Aktuelle Blitzdaten");
//ImageView initalisieren und Bild aus Blitzortung laden (BETA)
final ImageView myIv = (ImageView) boView.findViewById(R.id.imageBo);
final String URL = "http://blitzortung.ssv-ufs.ch/blitzortung.php?map=4";
Timer t = new Timer();
Timer txt = new Timer();
t.schedule(new TimerTask(){
@Override
public void run() {
myIv.setTag(URL);
new DownloadImagesTask().execute(myIv);
}
}, 0, 30000); //alle 30 sekunden...
txt.schedule(new TimerTask() {
public int interval = 30;
@Override
public void run() {
interval = interval-1;
//TEXT INTERVAL
textViewInterval.setText(Integer.toString(interval));
}
}, 0, 1000); //alle 1 sekunden...
//Variable Return
return boView;
}
Der AsyncTask sieht folgendermassen aus:
PHP:
public class DownloadImagesTask extends AsyncTask<ImageView, Void, Bitmap> {
ImageView imageView = null;
@Override
protected Bitmap doInBackground(ImageView... imageViews) {
this.imageView = imageViews[0];
return download_Image((String) imageView.getTag());
}
@Override
protected void onPostExecute(Bitmap result) {
imageView.setImageBitmap(result);
}
private Bitmap download_Image(String url) {
Bitmap bm = null;
try {
URL aURL = new URL(url);
URLConnection conn = aURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
} catch (IOException e) {
Log.e("Hub", "Error getting the image from server : " + e.getMessage().toString());
}
return bm;
}
}
Beim Setzen des TextViews stürzt die App ab.
Logcat sagt:
04-15 14:59:24.636 1408-1431/com.stormchase.ssv_ufsig.ch E/AndroidRuntime FATAL EXCEPTION: Timer-1
Process: com.stormchase.ssv_ufsig.ch, PID: 1408
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6094)
at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:824)
at android.view.View.requestLayout(View.java:16431)
at android.view.View.requestLayout(View.java:16431)
at android.view.View.requestLayout(View.java:16431)
at android.view.View.requestLayout(View.java:16431)
at android.support.v4.widget.DrawerLayout.requestLayout(DrawerLayout.java:762)
at android.view.View.requestLayout(View.java:16431)
at android.view.View.requestLayout(View.java:16431)
at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:352)
at android.view.View.requestLayout(View.java:16431)
at android.widget.TextView.checkForRelayout(TextView.java:6600)
at android.widget.TextView.setText(TextView.java:3813)
at android.widget.TextView.setText(TextView.java:3671)
at android.widget.TextView.setText(TextView.java:3646)
at com.stormchase.ssv_ufsig.ch.MainActivity$PlaceholderFragment$2.run(MainActivity.java:263)
at java.util.Timer$TimerImpl.run(Timer.java:284)
04-15 14:59:26.076 1408-1432/com.stormchase.ssv_ufsig.ch D/dalv
Geht das so überhaupt? Fehlermeldung selbst bei der Compilierung erhalte ich keine.
Bin froh für Ansätze.
Anmerkdung: Das ganze läuft in einer Activity mit Fragmente, im Fragment wurde ein neues Layout gealden (fragment_bo) in dessem sich die TextViews und ImageViews befinden. else if(number == 3) leitet vom Slidemenu ab, wenn Position 3 gewählt wurde.
Lasse ich die Timer weg und das Bild anzeigen, d.h. AsyncTask nur einmal ausführen dann klappts, aber alle 30sek geht nich.
EDIT:
Ich hab jetzt das mit dem setText und TextView (Timer für 1sek) auskommentiert und den 30sek belassen.
Kein Absturz mehr, das Bild wird korrekt alle paar Sekunden aktualisiert, nur das mit Textview klappt noch nicht.
Danke schon jetzt für die Anregungen.
Grüsse aus der Schweiz
Zuletzt bearbeitet: