Android, как дождаться завершения кода, прежде чем продолжить

У меня есть метод hostPhoto() ; Он в основном загружает изображение на сайт и извлекает ссылку. Затем у меня есть другой способ опубликовать ссылку на веб-сайт.

Теперь способ Im ', используя этот метод, выглядит следующим образом:

 String link = hostPhoto(); //returns a link in string format post(text+" "+link); // posts the text + a link. 

Моя проблема заключается в том, что hostPhoto() занимает несколько секунд, чтобы загрузить и получить ссылку, моя программа, похоже, не ждет и продолжит публикацию, поэтому я оставил ссылку нулевым,

В любом случае, я могу заставить его сначала получить ссылку … и затем отправить сообщение? Как какой-то onComplete? Или что-то в этом роде. Я думал, что мой метод выше будет работать, но, делая Log.i, кажется, что ссылка возвращается в строку через секунду или около того.

UPDATE: Это прогресс обновлений моей проблемы, im используя AsyncTask, как сообщалось, но ошибка Log.i, показывающая urlLink как нуль … это означает, что ссылка, запрошенная с hostphoto, никогда не возвращалась intime для журналов. ,

ОБНОВЛЕНИЕ 2: НАКОНЕЧНО РАБОТАЕТ! Проблема была в потоке в hostPhoto (), может кто-нибудь дать мне объяснение, почему этот поток вызвал бы это? Спасибо всем, кто ответил.

 private class myAsyncTask extends AsyncTask<Void, Void, Void> { String urlLink; String text; public myAsyncTask(String txt){ text=txt; } @Override protected Void doInBackground(Void... params) { urlLink=hostPhoto(); //Log.i("Linked", urlLink); return null; } @Override protected void onPostExecute(Void result) { try { Log.i("Adding to status", urlLink); mLin.updateStatus(text+" "+urlLink); Log.i("Status:", urlLink); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 

HostPhoto () делает следующее:

  String link; new Thread(){ @Override public void run(){ HostPhoto photo = new HostPhoto(); //create the host class link= photo.post(filepath); // upload the photo and return the link Log.i("link:",link); } }.start(); 

Здесь вы можете использовать AsyncTask,

AsyncTask

Используя это, вы можете выполнить код

hostPhoto()

В doInBackground (), а затем выполните код

post(text+" "+link);

В методе onPostExecute (), который будет лучшим решением для вас.

Вы можете написать код в этом шаблоне

 private class MyAsyncTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { hostPhoto(); return null; } @Override protected void onPostExecute(Void result) { post(text+" "+link); } } 

И может выполнить его, используя

  new MyAsyncTask().execute(); 

Я предполагаю, что вы (или должны быть) используете отдельный поток для асинхронного выполнения этого действия.

Вам нужно разместить post() в hostPhoto() который вызывается, когда hostPhoto() завершен.

Как правило, я сделал это с помощью AsyncTask с Android …

Это дает вам обратный вызов onPostExecute() который вы можете делать со своим post() внутри.

Вы можете использовать AsyncTask , см. Это :

EDIT : он представляет собой видео- учебник по асинтеграции или ссылается на этот пример: clic here

Вероятно, вам нужно будет взглянуть на шаблон обратного вызова в Java .

К вашему второму вопросу:

Может ли кто-нибудь дать мне объяснение, почему эта нить вызвала бы это?

Вы вызываете «link = photo.post (путь к файлу)»; Который работает на новом потоке. Пока этот метод все еще запущен, ссылка по-прежнему равна нулю, и текущий поток (основной поток) продолжает работать с этой ссылкой (в то время как null)

В этой ситуации вам нужно дождаться результата, так что пусть новый Thread запускает этот метод, и после завершения этого потока этот поток попросит основной поток обновить результат (некоторым обратным вызовом или обработчиком), все эти задания хорошо инкапсулированы Android AsyncTask