我有两个类:FeedItem和imgDownloader。在第二个中,我将网址抓取到图像上,在第一个中我制作方法setLink,在我的应用程序中通过Picasso分配和显示。
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
所以我使用了Callbacks,我得到了各种错误,如:
--------- 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 / Process:发送信号。 PID:3274 SIG:9
答案 0 :(得分:0)
您需要创建一个回调,AsyncTask可以使用该回调将数据发送到其调用Activity。
一个简单的接口可以从AsyncTask获取字符串就足够了。
您可以在我的Learn Android存储库中找到此方法传递图像的一个非常简单的示例。
答案 1 :(得分: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。它的方式正确。
答案 2 :(得分:0)
imgDownload task = new imgDownload();
String result = task.execute().get; // result is the output from onPostExecute.
答案 3 :(得分:0)
我在这里写了一个完整的指南:https://stackoverflow.com/a/36166643/3962091
一般过程是将AsyncTask
放在自己的类文件中,并在要发送结果的AsyncTask
中声明一个回调接口。然后,任何其他类(包括Activity
)都可以简单地实现回调接口,以获得AsyncTask
必须提供的任何结果。