У меня есть 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);
}
}
}
Как я могу вызвать второй поток, когда первый закончен?