Android, как ждать завершения кода, прежде чем продолжить - PullRequest
7 голосов
/ 22 августа 2011

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

Теперь я использую этот метод следующим образом:

String link = hostPhoto(); //returns a link in string format

post(text+" "+link); // posts the text + a link.

Моя проблема в том, что ...1007 * требуется несколько секунд, чтобы загрузить и получить ссылку, моя программа, похоже, не ждет и продолжает публиковать, поэтому я оставляю ссылку со значением NULL,

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

ОБНОВЛЕНИЕ: Это обновление обновлений по моей проблеме, я использую AsyncTask, как сообщается, но ошибка Log.i, показывающая urlLink как ноль ... это означает, что ссылка, запрошенная у hostphoto, никогда не возвращалась вовремя для журналов ..

ОБНОВЛЕНИЕ 2:НАКОНЕЦ РАБОТАЕТ!Проблема была в Thread внутри 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();

Ответы [ 5 ]

10 голосов
/ 22 августа 2011

Вы можете использовать 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();
2 голосов
/ 22 августа 2011

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

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

Обычно я делал это с AsyncTask с Android ...

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

0 голосов
/ 22 ноября 2016

На ваш второй вопрос:

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

Вы звоните "link = photo.post (filepath);" который работает в новом потоке. Пока этот метод все еще работает, ссылка все еще пуста, и ваш текущий поток (основной поток) продолжает работать с этой ссылкой (пустым в то время)

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

0 голосов
/ 22 августа 2011

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

0 голосов
/ 22 августа 2011

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

РЕДАКТИРОВАТЬ : и он представляет собой видео учебник асинхронной задачи, или обратитесьэтот пример: нажмите здесь

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