2015-08-13 2 views
1

Мое приложение имеет активность всплескПусть активность Всплеск ждать процесс

Он должен показывать не менее 5 секунд

Но в этой деятельности у меня есть еще один поток для синхронизации данных из Интернета

синхронизации процесса может занять более 5 секунд или менее 5 секунд.

Если менее чем за 5 секунд, Хэндлер должен ждать до пятого второго

если более 5 секунд, Хэндлер не должен ждать, пока процесс полного

Как сделать Handler ждать еще один поток?

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

    syncFromInternet(); // another thread may over 5 seconds 

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      Intent intent; 
      intent = new Intent(getApplicationContext(), SecondActivity.class); 
      startActivity(intent); 
     } 
    }, 5000); 

} 
+4

лучше задача использования асинхронной загрузки данных –

ответ

1

Вы должны сделать только простую логику Как

Когда обработчик завершает затем проверьте завершение метода syncFromInternet, если он завершил открытую основную деятельность

Когда syncFromInternet завершает затем проверить завершения обработчика, если оно завершено открыть основную деятельность.

выше объяснение в коде:

boolean isHandlerCompleted = false, isAsyncCompleted = false; 

new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      isHandlerCompleted = true; 
      if(isHandlerCompleted && isAsyncCompleted) 
      { 
      openMainActivity();// both thread completed 
      } 
     } 
    }, 5000); 


// in your async task add this condition when it completes its task 
isAsyncCompleted = true; 
if(isHandlerCompleted && isAsyncCompleted) 
{ 
openMainActivity();// both thread completed 
} // till this line 

// make this function to open main activity 
openMainActivity() 
{ 
Intent intent = new Intent(getApplicationContext(), SecondActivity.class); 
startActivity(intent); 
} 
+0

Я не тестировал все ответы, но я благодарю, что почти все ответы - это работа, в конце концов я выбираю этот ответ, потому что это самый простой, он очень ясно и легко понять –

+0

@CLSo спасибо – DroidDev

0

Вызов вашего обработчика внутри syncFromInternet() после выполнения нити.

+0

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

+0

В этом случае AsyncTask будет лучше ИЛИ Использовать {CountDownTimer}. Должен ли я дать вам код {CountDownTimer}? –

0

вы должны реализовать AsyncTask, так что это будет ждать, пока ваш syncFromInternet() не будет завершен.

private class BackgroundSplashTask extends AsyncTask { 

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

       // show progressbar    

      } 

      @Override 
      protected Object doInBackground(Object[] params) { 
       try { 

         syncFromInternet(); // sync in background 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

       return null; 
      } 

      @Override 
      protected void onPostExecute(Object o) { 
       super.onPostExecute(o); 
     // dismiss progressbar  
       Intent intent = new Intent(getApplicationContext(), SecondActivity.class); 
       startActivity(intent); // go to SecondActivity after syncFromInternet is completed 
       finish(); 

      } 

     } 
1

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

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>() { 

     private static final long FIVE_SECONDS = 5 * 1000; 
     private volatile Date mStartTime; 

     @Override 
     protected void onPreExecute() { 
      mStartTime = new Date(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // Do the syncing here 
      syncFromInternet(); 

      Date now = new Date(); 
      long execTime = now.getTime() - mStartTime.getTime(); 
      if(execTime < FIVE_SECONDS) { 
       Thread.sleep(FIVE_SECONDS - execTime); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      Intent intent = new Intent(...); 
      startActivity(intent); 
      finish(); 
     } 
    }; 
    asyncTask.execute(null, null); 
} 
1

Вы можете использовать этот код:

package com.example.untitled; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 

import java.io.File; 
import java.io.IOException; 

public class MyActivity extends Activity { 

    private volatile boolean isAvailable = false; 
    private volatile boolean isOver = false; 

    private Handler messageHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      super.handleMessage(msg); 
      switch (msg.what) { 
       case 0: 
        if (isOver) { 
         Log.e("messageHandler","isOver"); 
         transitToNewActivity(); 
        }else { 
         Log.e("messageHandler","isOver false"); 
        } 
        break; 
      } 
     } 
    }; 

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

     syncFromInternet(); // another thread may over 5 seconds 

     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       isOver = true; 
       Log.e("mainHandler", "Main handler expired"); 
       if (isAvailable) { 
        transitToNewActivity(); 
        Log.e("mainHandler", "isAvailable"); 
       }else { 
        Log.e("mainHandler","isAvailable false"); 
       } 
      } 
     }, 50000); 

    public void transitToNewActivity() { 
     Log.e("transitToNewActivity","Activity transited"); 
     Intent intent; 
     intent = new Intent(getApplicationContext(), SecondActivity.class); 
     startActivity(intent); 
    } 

    public void syncFromInternet() { 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(80000); 
        isAvailable = true; 
        messageHandler.sendEmptyMessage(0); 
        Log.e("syncFromInternet", "internet data synced"); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
     thread.start(); 
    } 
} 

и, пожалуйста, измените его в соответствии с вашими требованиями ,

+0

@CL Итак: эй ответ работал или нет .. ?? если это сработало, отметьте как принятый ответ .. Спасибо. – AndiGeeky

+0

Я видел логику, он должен работать, но слишком сложный, проще один –

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