Hi,
derzeit schreibe ich an einer App, welche Bildlinks aus einer Website extrahiert und diese in einem Grid in der App anzeigen soll (Mit Recyclerview).
Ich logge mich von einer Activity aus ein und bekomme die Session ID als Cookie, welche benötigt wird, um die Inhalte der Seite sehen zu können (Man muss eingeloggt sein). Per Intent gebe ich dann diese Session ID an die nächste Activity.
Die Bilder in voller Auflösung sind auf der Website auf eigenen Unterseiten. Von daher wird zuerst die Hauptseite mit jsoup geöffnet und es werden die Links zu den eigentlichen Unterseiten geparsed. Danach wird jeder Link mit jsoup geöffnet und von jeder Unterseite wird der Bildlink extrahiert. Dies mache ich mit inneren Asynctask Klassen:
Es gibt also eine Asynctask-Klasse, welche in der doinBackground-Methode die Hauptseite aufruft und die Links zu den Unterseiten extrahiert.
In der onPostExecute-Methode wird dann in einer for-Schleife für jeden Link eine neue Instanz einer zweiten Asynctask Klasse aufgerufen, welche für den jeweiligen Link den Bildlink extrahiert.
In der onPostExecute-Methode der zweiten Asynctask Klasse hat man also einen String (Der Bildlink). In genau dieser Methode möchte ich den jeweiligen Bildlink (mit Picasso, Glide, etc...) zur Recyclerview hinzufügen.
Und genau das ist anscheinend nicht möglich. Jedes Tutorial im Internet behandelt die Recyclerview nur so, dass eine komplette Liste von Links übergeben wird. Ich habe aber keine komplette Liste von Links, da das durchlaufen der zweiten Asynctask Objekte schon bis zu 30 Sekunden oder so dauern kann, es sind nämlich hunderte Bildlinks.
Das ist im Grunde genommen meine Frage. Es muss doch eine Möglichkeit geben, nach jedem fertig extrahiertem Bildlink eben diesen zur Recyclerview als Item hinzuzufügen. Ist nur die Frage wie
In meinem hier geposteten Quellcode ist die Recyclerview noch nicht mit drin, aber ich hoffe ihr könnte sehen, wie sich das ganze abspielt. Der Code funktioniert übrigens einwandfrei. Ich bekomme nach und nach alle Bildlinks, dies habe ich schon mit dynamisch genrierten Imageviews, welche mit Glide mit dem Link befüllt werden, ausprobiert. Bloß einfach so kostet es halt zu viel ressourcen und die App stürzt irgendwann ab.
Es muss doch einen Weg dafür geben, wenn man nicht sofort die komplette Liste hat, sondern die sich erst später nach und nach bildet
Ich hoffe ihr könnt mir helfen
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.w3c.dom.Text;
import java.io.IOException;
import java.util.Arrays;
public class Hauptseite extends AppCompatActivity {
String sid;
Elements e, e2, e3, e4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hauptseite);
//Session ID wird aus dem Intent extrahiert.
sid = getIntent().getStringExtra("sid");
//DownloadMain Asynctask wird ausgeführt.
new DownloadMain().execute(sid);
}
class DownloadMain extends AsyncTask<String, Void, String[]>
{
String sid = "";
@Override
protected String[] doInBackground(String... params) {
Document doc2 = null;
String[] links = null;
try {
doc2 = Jsoup.connect("URL der Seite")
.cookie("sid", params[0])
.get();
sid = params[0];
e = doc2.select("div#Bilder div");
e2 = e.select("a[href]");
int i = 0;
links = new String[e2.size()];
for(Element el : e2){
links[i++] = el.attr("abs:href");
}
} catch (IOException e) {
e.printStackTrace();
}
return links;
}
@Override
protected void onPostExecute(String[] s) {
super.onPostExecute(s);
//Für jeden Link wird ein DownloadThread Asynctask ausgeführt.
for(int j = 0; j < s.length; j++)
{
new DownloadThread().execute(sid, s[j]);
}
}
}
class DownloadThread extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... params) {
Document doc2;
String div = "";
try {
doc2 = Jsoup.connect(params[1])
.cookie("sid", params[0])
.get();
Elements elemente = doc2.select("div#Bild");
Element img = elemente.select("img").first();
String src = img.attr("abs:src");
div = src;
} catch (IOException e1) {
e1.printStackTrace();
}
return div;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//Hier müsste ich den Link an eine Methode übergeben, welche das Bild per URL als
//Item hinzufügt.
}
}
}
Alles anzeigen