2016-06-27 5 views
0

私はFeedItemとimgDownloaderという2つのクラスを持っています。 2番目の方法では、私はイメージにURLを拝借しています。最初のメソッドでは、setLinkメソッドを作成してそれを割り当て、自分のアプリにPicassoを介して表示します。 feedItem.classの別のクラスでAsyncTaskの結果を参照する方法は?

フラグメント:

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日後、私はまだ方法がわからない勉強ODそれを正しく行うためには、具体的な回答をする必要があります。

////////// 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)  

6月27日23:57:14.533 3274 -3302/pl.dariusz.app I/Process:シグナルを送信しています。 PID:3274 SIG:9

+0

は、インターフェイスを実装し、私はあなたのリンクからそのメソッドを使用しますが、それは(私のポストの編集を見て)動作しないタスク – adnbsr

答えて

0

あなたのAsyncTaskは、その呼び出し元のアクティビティにデータを送信するために使用できるコールバックを作成する必要があります。

十分ですAsyncTaskから文字列を取ることができますシンプルなインターフェイス。

あなたは私のLearn Androidリポジトリ内の画像を渡して、この方法は非常に簡単な例を見つけることができます。

0

は、パラメータあなたの所望の特性と非同期タスクのコンストラクタを追加します。

public class feedItem { 
    String mLink; 

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

詳細は:そのような何か:

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 
    } 
} 

と同様に、この非同期タスクを呼び出すソリューションをТhisは醜いです。その作品は、柔軟ではありません。コールバックに使用できるインターフェイスを作成できます。見てください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を提供している任意の結果を得るために、コールバックインターフェイスを実装することができます。

関連する問題