[英]Stop working Error while getting data from url using Jsoup
我是android編程的業余愛好者。 我正在使用Jsoup從網站獲取html並將其放入textview中,但出現錯誤。 我怎樣才能解決這個問題?
我的代碼:
package com.example.hashtag.asdasd;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
Document siteDoc;
String a;
Elements p;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn= (Button) findViewById(R.id.button);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new siteGetter().execute();
}
});
}
private class siteGetter extends AsyncTask < Void, Void, String>{
@Override
protected String doInBackground(Void... voids) {
try {
siteDoc = Jsoup.connect("http://hashtagedu.ir").get();
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
}
public void displaydata(){
p = siteDoc.getElementsByTag("p");
a=p.text();
TextView tv= (TextView) findViewById(R.id.textView);
tv.setText(a);
}
}
我的錯誤:
java.lang.RuntimeException:在java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)在android.os.AsyncTask $ 3.done(AsyncTask.java:309)處執行doInBackground()時發生錯誤。 android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:234)上的java.util.concurrent.FutureTask.run(FutureTask.java:242)上的util.concurrent.FutureTask.setException(FutureTask.java:223)位於java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:588)的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)位於java.lang.Thread.run(Thread.java:818)由以下原因引起:java.lang.SecurityException:Java的java.net.InetAddress.lookupHostByName(InetAddress.java:464)的java.net.InetAddress.lookupHostByName(InetAddress.java:464)的權限被拒絕(缺少INTERNET權限?)。 com.android.okhttp.internal.Network上的net.InetAddress.getAllByName(InetAddress.java:215)com.android.okhttp.internal.http.RouteSe上的net.InetAddress.java:215$1.resolveInetAddresses(Network.java:29) com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)上的lector.resetNextInetSocketAddress(RouteSelector.java:188)com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java: 100)在com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357)在com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340)在com.android.okhttp com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)的com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute的.internal.http.HttpEngine.connect(HttpEngine.java:330) (HttpURLConnectionImpl.java:437)在com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)在org.jsoup.helper.HttpConnection $ Response.execute(HttpConnection.java:563)在org。 org.jsoup.helper.HttpConnection.execute(HttpConnection.java:227)(位於org.jsoup.helper.HttpConnection)的jsoup.helper.HttpConnection $ Response.execute(HttpConnection.java:540)。 在com.example.hashtag.asdasd.MainActivity $ siteGetter.doInBackground(MainActivity.java:46)處獲得com.example.hashtag.asdasd.MainActivity $ siteGetter.doInBackground(MainActivity.java:39)處的(HttpConnection.java:216)在android.os.AsyncTask $ 2.call(AsyncTask.java:295)在java.util.concurrent.FutureTask.run(FutureTask.java:237)在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:234 )的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)的java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:588)的java.lang.Thread.run(Thread.java: 818)由以下原因引起:android.system.GaiException:android_getaddrinfo失敗:libcore.io.Posix.android_getaddrinfo(本機方法)處的libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)處的EAI_NODATA(與主機名關聯的地址)位於java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)的java.net.InetAddress.lookupHostByName(InetAddress.java:451)在java.net.InetAddress.getAllByNa 我(InetAddress.java:215)位於com.android.okhttp.internal.Network $ 1.resolveInetAddresses(Network.java:29)位於com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188) com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100)位於com.android.okhttp.internal處的com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)。 com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340)的com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine。)的http.HttpEngine.createNextConnection(HttpEngine.java:357) com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)上com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:437)上的java:330) .okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)在org.jsoup.helper.HttpConnection $ Response.execute(HttpConnection.java:563)在org.jsoup.helper.H ttpConnection $ Response.execute(HttpConnection.java:540)位於org.jsoup.helper.HttpConnection.execute(HttpConnection.java:227)位於org.jsoup.helper.HttpConnection.get(HttpConnection.java:216)位於com.example 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),位於java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:588),位於java.lang.Thread.run(Thread.java:818),原因:android.system.ErrnoException:android_getaddrinfo失敗:libcore.io.Posix.android_getaddrinfo(本機方法)處的libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)處的EACCES(權限被拒絕) com.android.okhttp.internal.Network上的java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)上的netAddress.lookupHostByName(InetAddress.java:451)在com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188)處的$ 1.resolveInetAddresses(Network.java:29)在com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java: 157)在com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100)在com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357)在com.android.okhttp com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)的com.android.okhttp.internal.http.HttpEngine.sendRequest的.internal.http.HttpEngine.nextConnection(HttpEngine.java:340) (HttpEngine.java:248)在com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:437)在com.android.okhttp.internal.huc.HttpURLConnec org上org.jsoup.helper.HttpConnection $ Response.execute(HttpConnection.java:563)的tionImpl.connect(HttpURLConnectionImpl.java:114)org上的org.jsoup.helper.HttpConnection $ Response.execute(HttpConnection.java:540)的tionImpl.connect(HttpURLConnectionImpl.java:114) org.jsoup.helper.HttpConnection.get(HttpConnection.java:216)上的.jsoup.helper.HttpConnection.execute(HttpConnection.java:227)com.example.hashtag.asdasd.MainActivity $ siteGetter.doInBackground(MainActivity.java) :46),位於com.example.hashtag.asdasd.MainActivity $ siteGetter.doInBackground(MainActivity.java:39),位於android.os.AsyncTask $ 2.call(AsyncTask.java:295),位於java.util.concurrent.FutureTask.run (FutureTask.java:237)在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:234)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:588)在java.lang.Thread.run(Thread.java:818)
您必須在清單中添加Internet權限。
<uses-permission android:name="android.permission.INTERNET" />
除了設置權限<uses-permission android:name="android.permission.INTERNET" />
您當前不調用displaydata()
並且如果您是在后台任務中調用的話,則應設置一個處理程序來調用ui線程上的更改:
public class MainActivity extends AppCompatActivity {
Handler uiHandler = new Handler();
Document siteDoc;
String a;
Elements p;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn= (Button) findViewById(R.id.button);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new siteGetter().execute();
}
});
}
private class siteGetter extends AsyncTask < Void, Void, String>{
@Override
protected String doInBackground(Void... voids) {
try {
siteDoc = Jsoup.connect("http://hashtagedu.ir").get();
displaydata();
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
}
public void displaydata(){
p = siteDoc.getElementsByTag("p");
a=p.text();
uiHandler.post(new Runnable() {
@Override
public void run() {
TextView tv= (TextView) findViewById(R.id.textView);
tv.setText(a);
}
});
}
}
關於將下載的圖像(如刪除的問題所述)添加到ImageView(假設id為R.id.imageView
)
Bitmap bitmap;
public void displaydata(){
p = siteDoc.getElementsByTag("p");
a=p.text();
String imageUrl = siteDoc.select("img").first().attr("abs:src");
bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageUrl).getContent());
uiHandler.post(new Runnable() {
@Override
public void run() {
TextView tv= (TextView) findViewById(R.id.textView);
tv.setText(a);
ImageView i = (ImageView)findViewById(R.id.imageView);
i.setImageBitmap(bitmap);
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.