2017-10-30 8 views
-4

Ich mache einen Startbildschirm für meine App und ich teste nur aus dem primären Thread in den Ruhezustand statt einen Timer verwenden. Mein Code ist:Launcher-Aktivität wird als leerer Bildschirm angezeigt

package com.example.somu.activityswitcher; 

import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class LauncherActivity extends AppCompatActivity { 

    public void firstActivity() { 
     Intent intent = new Intent(getApplicationContext(), MainActivity.class); 
     startActivity(intent); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_launcher); 

     TextView countDown = findViewById(R.id.count); 
     for (int cd=3;cd>0;cd--) { 
      try { 
       Thread.sleep(1000); 
       countDown.setText(Integer.toString(cd)); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     firstActivity(); 
    } 
} 

Während die MainActivity Lasten nach 3 Sekunden, der Begrüßungsbildschirm (LauncherActivity) ist nur ein leerer Bildschirm! Was ist denn hier los?!

activity_launcher.xml:

<?xml version="1.0" encoding="utf-8"?> 
<android.widget.RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.somu.activityswitcher.LauncherActivity"> 

    <ImageView 
     android:id="@+id/imageView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:scaleType="fitCenter" 
     android:scaleX="0.25" 
     android:scaleY="0.25" 
     app:srcCompat="@drawable/logo" /> 

    <TextView 
     android:id="@+id/textView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/count" 
     android:layout_centerHorizontal="true" 
     android:text="Switching in..." /> 

    <TextView 
     android:id="@+id/count" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="70dp" 
     android:text="3" 
     android:textColor="@android:color/black" 
     android:textSize="50sp" /> 
</android.widget.RelativeLayout> 

Wie kann ich dieses Problem beheben ?!

HINWEIS: Ich bin nicht über jede mögliche Weise störte dies zu beheben .. Ich möchte wissen, warum genau diese Methode nicht funktioniert, und was ist die nächste beste Art und Weise, ohne explizit einen Timer.

+1

ersetzen, dass lahm beschäftigt Schleife mit 'postDelayed()' und 'richtigen Runnable' –

+0

@MarcinOrlowski natürlich das würde funktionieren. Lies meine ursprüngliche Frage, falls du es nicht schon getan hast.Ich wollte keinen Timer benutzen und wollte nur wissen, warum das nicht funktionieren würde. Trotzdem danke. :) –

+0

@MarcinOrlowski oh, und der einzige Grund, warum ich diese Schleife verwendet habe, war, den Countdown auf dem Bildschirm zu zeigen. –

Antwort

1

diese versuchen kann sein, dies ist nützlich für Sie.

public class LauncherActivity extends AppCompatActivity { 
private TextView countDown; 
int cd; 

public void firstActivity() { 
    Intent intent = new Intent(getApplicationContext(), MainActivity.class); 
    startActivity(intent); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_launch); 

    countDown = (TextView) findViewById(R.id.count); 

    try { 
     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       for (cd = 3; cd > 0; cd--) { 
        countDown.setText(Integer.toString(cd)); 
       } 
       firstActivity(); 

      } 
     }, 3000); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 



} 

wenn Sie Countdown hinzufügen mögen, als dies von Handler insted setzen,

new CountDownTimer(3000, 1000) { 

     public void onTick(long millisUntilFinished) { 
      countDown.setText("seconds remaining: " + millisUntilFinished/1000); 

     } 

     public void onFinish() { 
      countDown.setText("done!"); 
      firstActivity(); 
     } 

    }.start(); 
0

Sie verwenden Thread.sleep(1000); im Hauptthread, die Ihre Benutzeroberfläche einfriert.

Da der UI-Thread eingefroren ist, kann die Aktivität in der Zwischenzeit nicht aufgepumpt und dargestellt werden, was zu einem leeren Bildschirm führt.

Sie können jedoch Thread.sleep in einem Hintergrundthread verwenden, aber Sie können UI nicht direkt von einem Hintergrund Thread aktualisieren. Sie können runOnUiThread UI von Hintergrund-Thread zu aktualisieren, wenn Sie Sie Countdown Code in einem

new Thread(new Runnable(){ 
    public void run(){ 
     //countdown code. 
     runOnUiThread(new Runnable(){ 
      public void run(){ 
       textView.setText(... 
      } 
     }); 
    } 
}).start() 
0

Thread.sleep(1000); Einfrieren Ihre UIThread platzieren.

versuchen diese

Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     tv = (TextView) findViewById(R.id.tv); 
     timer = new Timer(); 
     timer.scheduleAtFixedRate(new RemindTask(), 3000, 1000); // delay*/ 
    } 

private class RemindTask extends TimerTask { 

     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       public void run() { 
        i++; 
        Log.e("title", "" + i); 
        tv.setText(i + ""); 
        if (i == 3) { 
         timer.cancel(); 
         firstActivity(); 
        } 

       } 
      }); 

     } 
    } 
+0

Wo ist der Code, um den Ticker auf dem Bildschirm zu behandeln, um einen grundlegenden Countdown anzuzeigen? Das ist der ganze Grund, warum ich die Schleife überhaupt geschrieben habe! Lies zumindest meinen Code und verstehe meine Anforderungen bevor du antwortest ?! –

+0

@SomenathSinha hat die Lösung check update ans und es funktioniert gut in meinem Gerät –

+0

warum down voice .. ?????? Atleast geben Sie einen Grund –

0

Try this statt Thread.sleep(1000);

new CountDownTimer(3000, 1000) { 
      @Override 
      public void onTick(long l) { 
        countDown.setText(Integer.toString(l/1000)); 
      } 

      @Override 
      public void onFinish() { 
       firstActivity(); 
       finish(); 
      } 
     }.start(); 
0

Try CountDownTimer zu verwenden Timer statt Gewinde oder Handler anzuzeigen, wie unten:

onTick() laufen auf UI-Thread so Sie können die Benutzeroberfläche in dieser Methode aktualisieren, während Sie versuchen, (3,2,1) auf countDown TextView anzuzeigen.

onFinish aufgerufen, wenn der Timer abgelaufen ist, damit Sie Ihren Code hier nach dem Timer schreiben können, während Sie versuchen, eine andere Aktivität anzuzeigen.

new CountDownTimer(3000, 1000) { 

    public void onTick(long millisUntilFinished) { 
     countDown.setText(""+ (millisUntilFinished/1000)); 
    } 

    public void onFinish() { 
     firstActivity(); 
    } 
    }.start(); 
0
try this code. 

Intent intent = new Intent(this, WelcomeActivity.class); 
new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      try{ 
      startActivity(intent); 
      finish(); 
      } 
      catch (Exception e){ 

      } 
      } 
    }, 1000); 
Verwandte Themen