2011-12-28 2 views
2

На данный момент я работаю над проектом Android-phonegap.Android Splashscreen при работе AsyncTask

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

Мне удалось показать индикатор выполнения, когда работает A.Task, но я хотел бы добавить экран заставки в фоновом режиме. Я в основном работал с Phonegap и только начинал с собственного кода. Поэтому я смущен всеми этими макетами, темами и тем, что еще можно определить в XML-файлах. Я уверен, что это также хорошая идея для больших дизайнов пользовательского интерфейса, но для простого экрана Splash, который я хочу прямо сейчас, он чувствует себя полным перегибом.

Это фрагмент из источника. Просто прямо. onCreate() вызывает AsyncTask, которая выполняет некоторую работу и запускает PhoneGap в методе PostExecute. Я хочу, чтобы экран отображался либо в методе onCreate, либо onPreExecute. После того, как задание будет завершено, я отключу экран в onPostExecute(). Я также добавил комментарии, чтобы проиллюстрировать мою идею.

public class myAct extends DroidGap { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //Show Splash here or in onPreExecute()! 
     new myAsTa().execute(); 
    } 
} 


class myAsTa extends AsyncTask<Void, Integer, Boolean> { 
    ProgressDialog dialog = new ProgressDialog(myAct.this); 

    @Override 
    protected void onPreExecute() { 
     //or show splash here! 
     dialog.setMessage("Cool Progressbar!"); 
     dialog.show(); 
     super.onPreExecute(); 
    } 

    protected Boolean doInBackground(Void... values) { 
      //magician at work! 
      return true; 
     } 


     @Override 
     protected void onProgressUpdate(Integer... values) { 
      //insult user here 
     } 

     protected void onPostExecute(Boolean result) { 
      dialog.dismiss(); 
      //dismiss splashscreen 
      //start Phonegap 
     } 
    } 

Спасибо за чтение и помощь :)

ответ

5

Я сделал такую ​​заставку here. Это загружает макет заставки и сам запускается непосредственно из системы, когда приложение загружается (AndroidManifest.xml)

<activity android:name=".SplashActivity" 
       android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
</activity> 

То, что показано на экране определяется в setContentView(R.layout.splash); - это расположение в основном

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:background="@drawable/desktop_rhq" 

     > 

    <TextView android:layout_gravity="bottom" 
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content" 
       android:layout_marginBottom="10dp" 
       android:text="@string/loading" 
      /> 
</LinearLayout> 

Какие определяет фоновое изображение и некоторый текст для отображения. Честно говоря, я не очень много думал об изменении ориентации во время запуска всплеска - я думаю, это перезапустит фоновое задание.

+0

Вы хотите добавить немного больше информации? Это выглядит хорошо, но я не уверен на 100%, как его использовать. Является ли всплеск определенным в макете? Не могли бы вы также показать, как это делается, поскольку я никогда не работал с макетами? – yoshi

+0

... и как он действует на изменение ориентации? – Selvin

+0

спасибо. отлично работает для меня. Хотя я не вижу, в чем разница между вашим кодом и моим подходом. :) Однако спасли мою неделю. Для изменений ориентации я в порядке, потому что он заблокирован для приложения в любом случае^.- – yoshi

1

splash.xml

<?xml version="1.0" encoding="utf-8"?> 
<ImageView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 

    android:src="@drawable/splash_image"> 

</ImageView> 

SplashActivity.class

public class SplashActivity extends Activity { 

     protected boolean _active = true; 
     protected int _splashTime = 1000; // time to display the splash screen in ms 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.splash); 

     // thread for displaying the SplashScreen 
      Thread splashTread = new Thread() { 
       @Override 
       public void run() { 
        try { 
         int waited = 0; 
         while(_active && (waited < _splashTime)) { 
          sleep(100); 
          if(_active) { 
           waited += 100; 
          } 
         } 
        } catch(InterruptedException e) { 

        } finally { 

         startActivity(new Intent(SplashActivity.this, NextActivity.class)); 
         finish(); 
         //stop(); 
        } 
       } 
      }; 
      splashTread.start(); 
     } 
    } 

для воздействия на изменения ориентации: я Установить в AndroidManifest.xml screenOrientation="portrait"

<activity 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" 
      android:theme="@android:style/Theme.NoTitleBar" 
      android:name=".SplashActivity" > 
      <intent-filter > 
       <action android:name="android.intent.action.MAIN" /> 

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

Мне не нравится идея иметь фиксированное количество времени для показа всплеска. Это происходит только в первые минуты, пока данные получены, поэтому я предпочитаю держать его как можно короче =) – yoshi

Смежные вопросы