#java #android #android-fragments #android-asynctask #jsoup
#java #Android #android-фрагменты #android-asynctask #jsoup
Вопрос:
Я новичок в Java и Android, поэтому мне нужна ваша помощь. Я внедрил JSoup в своем приложении, чтобы извлекать это с веб-страницы и показывать в textview (я работаю во фрагменте, но я думаю, что это то же самое, что и стандартное действие в данном случае).
<body marginwidth="0" marginheight="0">
<h1></h1>
<p class="testoprezzo">0.5516 </p>
</body>
Я должен взять только 0,5516
Я понятия не имею, как это сделать. Вы можете мне помочь? Это код, который я уже написал:
class fetcher extends AsyncTask<Void,Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
try {
String value = "https://mywebpage.net/";
Document document = Jsoup.connect(value).followRedirects(false).timeout(30000).get();
Element p= document.select ("p.testoprezzo").first();
((Globals)getApplication()).setValore(p.text());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
TextView valore = findViewById(R.id.textView4);
valore.setText(((Globals)getApplication()).getValore());
}
}
Заранее благодарю вас!
Ответ №1:
Постарайтесь использовать максимально ограничивающий селектор, чтобы не получить нерелевантных результатов. В вашем случае вы должны использовать —
Element e = doc.select("p.testoprezzo").first();
String result = p.text();
Ответ №2:
Используйте элементы, чтобы получить тег p.
class fetcher extends AsyncTask<Void,Void, Void> {
String txtValue;
@Override
protected Void doInBackground(Void... arg0) {
try {
String value = "https://mywebpage.net/";
Document document = Jsoup.connect(value).followRedirects(false).timeout(30000).get();
Element p= document.select ("p.testoprezzo").first();
txtValue = p.text();
} catch (Exception e) {
// TODO Auto-generated catch block
txtValue = null;
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
TextView valore = findViewById(R.id.textView4);
valore.setText(txtValue);
}
}
Пожалуйста, обратите внимание, что Элементы и элемент разные. Используйте их в соответствии с вашими потребностями. Вот список всех селекторов вместе с примером.
Также обратите внимание: НЕ ВНОСИТЕ НИКАКИХ ИЗМЕНЕНИЙ в UI в doInBackground
методе, иначе вы получите сообщение об ошибке.
Комментарии:
1. Я пробовал, но Android Studio не разрешает метод «select» в элементе p = document.select(«p»).first();
2. убедитесь, что вы импортируете что-то подобное этому
import org.jsoup.nodes.Document;
в разделе импорта, а не другие.. в зависимости от вашего проекта доступно 3-4 типа документов.3. И последний вопрос, как перенести значение результирующей строки в textview? Я попробовал postExecute, но, похоже, работает по-другому во фрагменте
4. Объявите глобальную строковую переменную и
doInBackground
присвоите это значениеp
вашей строковой переменной, затем вonPostExecute
методе напишите эту строкуyourTextView.setText(your_string_variable_name);
5. Хм … по некоторым причинам это не работает, но я не могу понять, почему, приложение запускается, но текст не выводится