簡體   English   中英

使用Jsoup從網址獲取數據時停止工作錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM