2016-06-27 3 views
0

У меня есть 2 класса: FeedItem и imgDownloader. Во втором я очищаю URL-адрес изображения, а в первом я делаю метод setLink, назначаю его и отображаю через Picasso в своем приложении.Как ссылаться на результат AsyncTask в другом классе?

Фрагмент feedItem.class:

public class feedItem { 
    String link; 

public void setLink(String link) { 

    imgDownload task = new imgDownload(); 
    String urlx = task...; //Here should be a result of that AsyncTask's doInBackground 
    this.link = urlx; 
} 
} 

imgDownload.class:

public class imgDownload extends AsyncTask<String, String, String> { 

    feedItem item = new feedItem(); 
    String url = item.getLink(); 
    String imglink; 

    @Override 
    protected String doInBackground(String... params) { 
     Document doc = null; 
     try { 
      doc = Jsoup.connect(url).get(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Element masthead = doc.select("div.post-image").select("img[src~=(?i)\\.(png|jpe?g)]").first(); 
     url = masthead.absUrl("src"); 
     return url; 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     imglink = result; //Result of doInBackground 
    } 
} 

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

////////// EDIT

Таким образом, я использовал это колбека, и я получаю различные ошибки, например, что:

                --------- beginning of crash 
06-27 23:57:14.446 3274-3321/pl.dariusz.app E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2 
                  Process: pl.dariusz.app, PID: 3274 
                  java.lang.RuntimeException: An error occurred while executing doInBackground() 
                   at android.os.AsyncTask$3.done(AsyncTask.java:309) 
                   at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
                   at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
                   at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
                   at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
                   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                   at java.lang.Thread.run(Thread.java:818) 
                  Caused by: java.lang.IllegalArgumentException: Must supply a valid URL 
                   at org.jsoup.helper.Validate.notEmpty(Validate.java:102) 
                   at org.jsoup.helper.HttpConnection.url(HttpConnection.java:72) 
                   at org.jsoup.helper.HttpConnection.connect(HttpConnection.java:36) 
                   at org.jsoup.Jsoup.connect(Jsoup.java:73) 
                   at pl.dariusz.app.imgDownloader.doInBackground(imgDownloader.java:30) 
                   at pl.dariusz.app.imgDownloader.doInBackground(imgDownloader.java:12) 
                   at android.os.AsyncTask$2.call(AsyncTask.java:295) 
                   at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                   at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)  
                   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
                   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
                   at java.lang.Thread.run(Thread.java:818)  

06-27 23: 57: 14,533 3274 -3302/pl.dariusz.app I/Процесс: сигнал отправки. PID: 3274 SIG: 9

+0

вы можете реализовать интерфейс и установить его в конструкторе задачи – adnbsr

ответ

0

Вам необходимо создать обратный вызов, который ваша AsyncTask может использовать для отправки данных в свою вызывающую деятельность.

Простой интерфейс, который может принимать строки из AsyncTask, должен быть достаточным.

Вы можете найти очень простой пример этого метода, передающего изображения в моем репозитории Learn Android.

0

Добавить конструктор для задачи Async с параметром требуемого свойства. Нечто подобное:

public class ImgDownload extends AsyncTask<String, String, String> { 

    feedItem item = new feedItem(); 
    String url = item.getLink(); 
    String imglink; 

    public ImgDownload(String link){ 
     imglink = link; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     Document doc = null; 
     try { 
      doc = Jsoup.connect(params[0]).get(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Element masthead = doc.select("div.post-image").select("img[src~=(?i)\\.(png|jpe?g)]").first(); 
     url = masthead.absUrl("src"); 
     return url; 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     imglink = result; //Result of doInBackground 
    } 
} 

и называем это асинхронной задачи, как:

public class feedItem { 
    String mLink; 

    public void setLink(String rawLink) { 
     imgDownload task = new imgDownload(mLink); 
     task.execute(rawLink); 
    } 
} 

Подробнее: решения является Вилла Руж некрасиво. Его работы, но его негибкие. Вы можете создать интерфейс, который вы можете использовать для обратного вызова. Посмотрите here. Это точно правильный путь.

+0

Я использовал этот метод из вашей ссылки, но он не работает (посмотрите редактирование моего сообщения). – bioreset

0
imgDownload task = new imgDownload(); 
String result = task.execute().get; // result is the output from onPostExecute. 
0

Я написал полное руководство о том, как сделать это здесь: https://stackoverflow.com/a/36166643/3962091

Общий процесс должен поставить AsyncTask в своем собственном файле класса, и объявить интерфейс обратного вызова в AsyncTask, к которому вы отправит результаты. Тогда любой другой класс (включая Activity) может просто реализовать интерфейс обратного вызова, чтобы получить любые результаты, которые может предложить AsyncTask.

Смежные вопросы