2013-03-18 2 views
0

Я разрабатываю приложение для Android. При запуске приложение должно отображать экран Splash при проверке обновления файла. Если файл не обновлен, он запускает задачу Async для обновления файла. Проблема заключается в том, что изображение экрана Splash только показывает, когда файл действительно нуждается в обновлении. Кроме того, при выполнении проверки отображается черный экран.Всплеск экрана на Android не работает

Моя SplashScreen активность:

public class SplashActivity extends Activity 
{ 
    private final static String placesFile = "places"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.activity_splash); 
    } 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 

     if(!isFileUpdated()){ 
      new PlacesService(this).execute(); 
     }else{ 
      intentAndFinish(); 
     } 

    } 
    private void intentAndFinish() { 
     finish(); 
     Intent mainIntent = new Intent(this, MainActivity.class); 
     startActivity(mainIntent); 
    } 

    /** 
    * 
    * @return false if Places Data is too old 
    */ 
    private boolean isFileUpdated() { 
     int daysOld = 0; 
     File f = new File(this.getFilesDir().getAbsolutePath() +"/"+placesFile); 
     if(f.exists()){ 
      System.out.println("existe"); 
     } 
     Date d = new Date(); 
     Date currentDate = new Date(System.currentTimeMillis()); 
     d.setTime(f.lastModified()); 
     if(currentDate.compareTo(d)>0) 
      daysOld = determineDifferenceInDays(d, currentDate); 
     return daysOld < Consts.PLACES_DAYS_OLD_QTY_PERMITTED?true:false; 
    } 
    private static int determineDifferenceInDays(Date date1, Date date2) { 
     Calendar calendar1 = Calendar.getInstance(); 
     calendar1.setTime(date1); 
     Calendar calendar2 = Calendar.getInstance(); 
     calendar2.setTime(date2); 
     long diffInMillis = calendar2.getTimeInMillis() - calendar1.getTimeInMillis(); 
     return (int) (diffInMillis/(24* 1000 * 60 * 60)); 
    } 

    public void onResultFromAsyncTask(boolean finished) { 
     if(finished){ 
      intentAndFinish(); 
     } 
    } 
} 

activity_splash.xml

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 

    <ImageView android:src="@drawable/splash_es" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       /> 
</LinearLayout> 
+0

Я думаю, что вы закрываете свою активность, если файл активирован в onResume – sheetal

+0

, пожалуйста, создайте asyntask в отдельном классе, не синхронизируйтесь в том же классе активности. – AndroidEnthusiastic

+0

Удалите свой «XML» и разместите свою «AsyncTask». – adneal

ответ

2

Вы убиваете свой Всплеск, прежде чем он будет на экране. Потому что вы убиваете его внутри метода onResume. Смотрите эту часть документации:

Срок службы переднего плана от деятельности происходит между вызовом onResume() до тех пор, соответствующий вызов OnPause(). За это время активность перед всеми другими действиями и взаимодействием с пользователем. Активность может часто проходить между возобновленными и приостановленными состояниями - например, когда устройство переходит в спящий режим, когда доставляется результат деятельности, когда доставляется новое намерение, поэтому код в этих методах должен быть достаточно легким.

Вы можете использовать обработчик, он более изящный, чем Thread, чтобы решить эту проблему, но основная идеала такая же, как и у @sheetal.

На OnCreate метод:

handler = new Handler(); 

О методе onResume:

handler.postDelayed(new Runnable() { 
    public void run() { 
     if(!isFileUpdated()){ 
     new PlacesService(this).execute(); 
     }else{ 
     intentAndFinish(); 
     } 
    } 
}, 1000); 
+0

да, я получил это. Спасибо – sheetal

+0

Спасибо @Bruno. Не только вы дали ответ, но и объяснили жизненный цикл деятельности. – Ejmedina

0

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

private void intentAndFinish() { 
    Thread.sleep(10000) 
    finish(); 
    Intent mainIntent = new Intent(this, MainActivity.class); 
    startActivity(mainIntent); 
} 

Просто догнать ваш splashScreen.

Смотреть пост @bruno «S ... Мы должны использовать обработчик

+0

Не следует использовать thread.sleep в ui thread, так как это скорее всего вызовет ANR. –

+0

@DavidOlsson ohkk, но luk на его код..Он никогда не увидит его SplashScreen таким образом. В резюме только он переключает активность. Okk, чем использование Handler, может быть хорошим способом. – sheetal

+0

. Я не хочу, чтобы пользователь не жди. Я хотел показать экран заставки, делая что-то в фоновом режиме. – Ejmedina

0

вы звоните в isFileUpdated() занимает время положить его в фоновом режиме Вы asyntask должно быть что-то вроде этого

public class PlacesService extends Asynctask<Void,Void,Void>{ 
    boolean flag=false 
    public Void doInBackground(){ 
    flag=isFileUpdated() 
    if (!flag){ 
    return 
    }else { 
    // Do your file update 
    } 
    return 

    } 

public onPostExcecute(){ 
intentAndFinish(); 

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