首页 文章

使用Jsoup从url获取数据时停止工作错误

提问于
浏览
2

我是android编程的业余爱好者 . 我正在使用Jsoup从网站获取html并将其放入textview但我收到错误 . 我怎样才能解决这个问题?

My code:

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

My Errors:

java.lang.RuntimeException:在java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)上的android.os.AsyncTask $ 3.done(AsyncTask.java:309)上执行doInBackground()时发生错误.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) )引起:java.lang.SecurityException:在java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)的java.net.InetAddress.lookupHostByName(InetAddress.java:464)上的权限被拒绝(缺少INTERNET权限?) .net.InetAddress.getAllByName(InetAddress.java:215)at com.android.okhttp.internal.Network $ 1.resolveInetAddresses(Network.java:29)at com.android.okhttp.internal.http.Route Selector.resetNextInetSocketAddress(RouteSelector.java:188)在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.internal.http.HttpEngine.nextConnection(HttpEngine.java:340)com.android.okhttp的com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357) .internal.http.HttpEngine.connect(HttpEngine.java:330)at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute (HttpURLConnectionImpl.java:437)在com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)在org.jsoup.helper.HttpConnection $ Response.execute(HttpConnection.java:563)的组织 . jsoup.helper.HttpConnection $ Response.execute(HttpConnection.java:540)org.jsoup.helper.HttpConnection.execute(HttpConnection.java:227)atg.jsoup.helper.HttpConnectio n.get(HttpConnection.java:216)在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)at java.util.concurrent.FutureTask.run(FutureTask.java:237)at android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java) :234)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)引起:android.system.GaiException:android_getaddrinfo失败:在libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)的libcore.io.Posix.android_getaddrinfo(Native Method)中,EAI_NODATA(没有与主机名关联的地址) )java.net.InetAddress.getAllByName(InetAddress.java:451)at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)at java.net.InetAddress.getAllByName( InetAddress.java:215)com.android.okhttp.internal.Network $ 1.resolveInetAddresses(Network.java:29)at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188)at com . android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)位于com.android.okhttp.internal.http的com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100) . HttpEngine.createNextConnection(HttpEngine.java:357)在com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340)在com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java: 330)在com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)在com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:437)在com.android.okhttp .internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)org.jsoup.helper.HttpConnection $ Response.execute(HttpConnection.java:563)at org.jsoup.helper.HttpConnection $ R esponse.execute(HttpConnection.java:540)atg.jsoup.helper.HttpConnection.execute(HttpConnection.java:227)atg.jsoup.helper.HttpConnection.get(HttpConnection.java:216)at 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.ThreadPoolExecutor.runWorker(ThreadPoolExecutor)的android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:234)的java.util.concurrent.FutureTask.run(FutureTask.java:237) . java:1113)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:588)at java.lang.Thread.run(Thread.java:818)引起:android.system.ErrnoException:android_getaddrinfo失败:在java.net.InetAddress的libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)上的libcore.io.Posix.android_getaddrinfo(本地方法)中的EACCES(权限被拒绝) .lookupHostByName(InetAddress.java:451)at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)at java.net.InetAddress.getAllByName(InetAddress.java:215)at com.android.okhttp.internal.Network $ 1 .resolveInetAddresses(Network.java:29)位于com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)的com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188) )com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100)位于com.android.okhttp的com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357)中的com.android.okhttp.internal.http.RouteSelector.next . internal.http.HttpEngine.nextConnection(HttpEngine.java:340)at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)at at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)位于com.android.okhttp.internal的com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:437) . huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)org.jsoup.helper.HttpConnection $ Response.execute(HttpConnection.java:563)at org.jsoup.helper.HttpConnection $ Response.execute(HttpConnection.java:540) at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:227)atg.jsoup.helper.HttpConnection.get(HttpConnection.java:216)at com.example.hashtag.asdasd.MainActivity $ siteGetter.doInBackground(MainActivity) .java:46)at com.example.hashtag.asdasd.MainActivity $ siteGetter.doInBackground(MainActivity.java:39)at android.os.AsyncTask $ 2.call(AsyncTask.java:295)at 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)at at Java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:588)at java.lang.Thread.run(Thread.java:818)

2 回答

  • 3

    您必须为清单添加Internet权限 .

    <uses-permission android:name="android.permission.INTERNET" />
    
  • 1

    除了设置权限 <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);
            }
        });
    }
    

相关问题