Как сделать чтобы один поток дожидался другого?
Я знаю, как взять из страницы её содержимое, распарсить и получить нужную строку. К слову, вот он:
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
MusicRepository.SongDownload songDownload = new Retrofit.Builder().baseUrl(url).addConverterFactory(GsonConverterFactory.create()).build().create(MusicRepository.SongDownload.class);
Object obj = null;
try {
if (songDownload != null) {
obj = songDownload.getSongs(playingSong.mp3id, playingSong.hash).execute().body().get(0);
}
} catch (IOException e) {
e.printStackTrace();
}
ArrayList<Object> list = GSON.fromJson(GSON.toJson(obj), TPE);
if (list != null) {
ssrc = list.get(2).toString(); // Получаю ссылку
}
}
}, 0);
Мне надо сделать метод, благодаря которого я смогу возвращать сею ссылку. Ибо, из одного потока нельзя передавать в другой данные, то подскажите, как сделать так, чтобы главный поток дождался того, что парсит страницу и когда всё закончилось, то метод в главном потоке возвратил значение.
Ответы (2 шт):
Автор решения: Виталий Перятин
→ Ссылка
Если решать данную задачу нативными средствами Android, то я бы смотрел в сторону Handler'ов. В Вашем случае можно сделать так:
- Запустить отдельный поток, который парсит страницу.
- Получить Looper главного потока и прикрепить ему Handdler
- Производить общение между потоками через Handler. Все сообщения внутри handleMessage будут обрабатываться внутри главного потока (если получен Looper главного потока)
Вот хорошая статься про Handler'ы: https://medium.com/@manishgiri/android-handler-tutorial-ccda6994f01c
Автор решения: KeyGenQt
→ Ссылка
метод в главном потоке возвратил значение.
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;
import java.util.Timer;
import java.util.TimerTask;
interface ListenerLink {
void onLink(String link);
}
void getLink(ListenerLink listener) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override public void run() {
new Handler(Looper.getMainLooper()).post(() -> {
listener.onLink("my link");
});
}
}, 100);
}
getLink(new ListenerLink() {
@Override public void onLink(String link) {
Toast.makeText(getContext(), link, Toast.LENGTH_LONG).show();
}
});