2014-08-03 3 views
-1

Я пытаюсь показать заставку перед показом моего основного вида деятельности. Я делаю это так (PuzzleActivity моя основная деятельность):Заставка для Android не отображается

public class PuzzleActivity extends Activity{ 
... 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.splash); 
    ... 
    ... (Do some background work) 
    ... 
    Thread.sleep(20000); // Sleep for 20 seconds 
    setContentView(R.layout.activity_main); 
} 
} 

Я ожидаю, что моя заставка, чтобы показать, по крайней мере, 20 секунд.

Тем не менее, он вообще не отображается. Вместо этого я вижу черный экран в течение 20 секунд, а затем мой основной экран активности ...

Когда я попытался удалить последний setContentView(), я увидел свой заставку.

Может кто-нибудь сказать мне, почему я не вижу свой заставку при использовании кода выше?

+1

Thread.sleep() - проблема. Использовать Handler с postDelayed (новый Runnable) – Decoy

ответ

0

Я обнаружил, что экран пуст, пока метод своей деятельности в OnCreate() не закончится. Поэтому единственное, что мне нужно было сделать, - это перевести обработку, которая будет выполнена из метода onCreate() (с помощью обработчика). Тогда я мог бы легко переключить контент.

0

Вы должны сначала setContentView, а затем запустить Thread так:

setContentView(R.layout.activity_splash_screen); 

    Thread background = new Thread() { 
     public void run() { 

      try { 
       sleep(1*1000); 

       Intent i=new Intent(SplashScreen.this, MainActivity.class); 
       startActivity(i); 

       //Remove activity 
       finish(); 

      } catch (Exception e) { 

      } 
     } 
    }; 

    // start thread 
    background.start(); 
1

Thread.sleep(time) вызывает поток, который послал это сообщение, чтобы спать в течение заданного интервала времени.

Вызов Thread.sleep(20000); из потока пользовательского интерфейса заставит его спать в течение 20 секунд, оставляя вашу активность невосприимчивой, что обычно является плохим идеей.

Я лично построить специальную пусковую деятельность для заставок и после того, как желаемое количество времени прошло, я перейти к основной деятельности, в вашем случае это будет нечто вроде следующим образом:

public class SplashActivity extends Activity { 

     // Splash screen time in milliseconds 
     private static final long LOADING_TIME = 2000; 

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

      Thread timer = new Thread() { 
       public void run() { 
        try { 
         sleep(LOADING_TIME); 
        } catch (InterruptedException ie) { 
         ie.printStackTrace(); 
        } finally { 
         Intent openMainActivity = new Intent(SplashActivity.this, PuzzleActivity.class); 
         startActivity(openMainActivity); 
         SplashActivity.this.finish(); 
        } 
       } 
      }; 

      timer.start();   
     } 
    } 
0

На Android , следует избегать всплесков в максимально возможной степени. Таким образом, не показывая, что это решит вашу проблему и сделает ваше приложение следовать рекомендациям. Если у вас не будет тяжелой нагрузки.

Если ваше приложение имеет трудоемкую начальную фазу установки, рассмотрите возможность отображения заставки или рендеринга основного вида как можно быстрее, укажите, что происходит загрузка, и асинхронно заполняйте информацию. В любом случае вы должны как-то указать, что прогресс достигнут, чтобы пользователь не заметил, что приложение заморожено.(source)

Некоторые ссылки стоит читать слишком (или для вас или вашего клиента):

(да, в конце концов, клиент делает решение, но небольшое образование никогда не бывает бесполезным)

0

Что я делаю:

Manifest:

<activity 
     android:name="com.antonis.android.eventz.MainActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" > 
     <intent-filter> 
      <action android:name="splashImage" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.antonis.android.eventz.SplashActivity" 
     android:label="@string/title_activity_splash" 
     android:screenOrientation="portrait" 
     android:theme="@android:style/Theme.NoTitleBar" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

, а затем это в моем классе разбрызгивания:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_splash); 

    Thread splashTread = new Thread() { 

     @SuppressWarnings("deprecation") 
     @Override 
     public void run() { 

      try { 
       sleep(1000); 
      } catch (InterruptedException e) { 
       // do nothing 
      } finally { 
       SplashActivity.this.finish(); 
       startActivity(new Intent("splashImage")); 
      } 
     } 
    }; 
    splashTread.start(); 
} 
Смежные вопросы