Обработчик вызовов, когда другой обработчик уже завершен - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть 2 обработчика, первый получает IP, вторая попытка получает код страны. Если я знаю IP, я могу выполнить второй обработчик, второй зависит. Но когда я выполняю свой код, оба потока выполняются одновременно, я пытаюсь с myThread.join, но у меня такое же поведение.

public class SplashScreen extends AppCompatActivity{                     
Handler handler = new Handler();                               
SharedPreferences settings;
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash_screen);

    settings = this.getSharedPreferences("appInfo", 0);
    String ipAddress = settings.getString("ipAddress", null);

    if(ipAddress == null) {
        Runnable runnable = new IPAddressThread(handler, this); 
        handler.postDelayed(runnable, 5000);
        Thread thread = new Thread(runnable);
        thread.start();
    }
    String countryCode = settings.getString("countryCode", null);
    String storeNumber = settings.getString("storeNumber", null);

    if(countryCode == null || storeNumber == null) {
        Handler handlerStore= new Handler();
        Runnable runnableStore = new StoreDetailThread(handlerStore, this);
        handlerStore.postDelayed(runnableStore, 5000);
        Thread threadStore = new Thread(runnableStore);
        threadStore.start();
    } }

И работоспособная реализация:

public class IPAddressThread implements Runnable {

private Handler handler;
private SplashScreen settings;
IPAddressThread(Handler handler,  SplashScreen settings){
    this.handler=handler;
    this.settings=settings;
}

/**
 *
 */
@Override
public void run() {
    handler.postDelayed(this, 5000);
    String ip= NetworkDetails.getInstance().getIpAddress();
    if(ip!=null && !ip.isEmpty()){

        settings.setStoreFormat("ipAddress", ip);
        handler.removeCallbacks(this);
    }else{
        System.out.println("Searching....");
    }
}



public class StoreDetailThread  implements  Runnable{
private Handler handler;
private SplashScreen settings;
private String storeDetail;

/**
 * Class Constructor.
 *
 * @param handler
 * @param settings
 */
 public  StoreDetailThread(Handler handler, SplashScreen settings){
    this.handler=handler;
    this.settings=settings;
}


/**
 *
 */
@Override
public void run() {

    String host= NetworkDetails.getInstance().getHostNetwork();
    if(host.contains(PATTERN_FOR_STORE_NUMBER)) {

        try{
            String countryCode=storeDetail.substring(FIRST_POSITION_COUNTRY_CODE,LAST_POSITION_COUNTRY_CODE);
            String storeNumber=storeDetail.substring(FIRST_POSITION_STORE_NUMBER,LAST_POSITION_STORE_NUMBER);

            settings.setStoreFormat("countryCode", countryCode);
            settings.setStoreFormat("storeNumber", storeNumber);
            handler.removeCallbacks(this);

        }catch (IndexOutOfBoundsException exception){
            handler.postDelayed(this, 5000);
        }


    }else{
        handler.postDelayed(this, 5000);
    }


}

}

Как я могу вызвать второй поток, когда первый закончен?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...