2016-09-26 77 views
2

我是一名android编程的业余爱好者。我使用Jsoup从网站获取html并将其放入textview,但出现错误。我怎样才能解决这个问题?停止工作使用Jsoup从网址获取数据时出错

我的代码:

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:而在android.os.AsyncTask $ 3执行doInBackground() 发生错误。完成(AsyncTask.java:309) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) at java.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.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:588) 在java.lang中的234) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) :的.java .Thread.run(Thread.java:818) 引起:java.lang.SecurityException:权限被拒绝(缺少 INTERNET权限?) 在java.net.InetAddress.lookupHostByName(InetAddress.java:464) 在java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 在java.net.InetAddress.getAllByName(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.nextProxy(RouteSelector.java:157) at 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) 在 融为一体。 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) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114) 在 org.jsoup.helper.HttpConnection $ Response.execute(HttpConnection.java:563) 在 org.jsoup.helper.HttpConnection $ Response.execute(HttpConnection.java:540) 在org.jsoup.helper。 HttpConnection.execute(HttpConnection.java:227) at org.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.FutureTask.run(FutureTask.java:237) 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) 引起:android.system.GaiException:android_getaddrinfo失败: EAI_NODATA(没有与主机名关联的地址) at libcore.io.Posix.android_getaddrinfo(Native Method) at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55 ) 在java.net.InetAddress.lookupHostByName(InetAddress.java:451) 在java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 在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) 在 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) at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330) at 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) 在 org.jsoup.helper.HttpConnection $回应.execute(HttpConnection.java:540) at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:227) at org.jsoup.helper.Htt pConnection.get(HttpConnection.java:216) 在 com.example.hashtag.asdasd.MainActivity $ siteGetter.doInBackground(MainActivity.java:46) 在 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) at android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util 。同时。的ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:588) 在java.lang.Thread.run(Thread.java:818) 产生的原因:android.system.ErrnoException:android_getaddrinfo失败: EACCES(拒绝) 在libcore .io.Posix.android_getaddrinfo(Native Method) at java.net.InetAddress.java:451 at java.net.InetAddress上libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55) 。 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.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) at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340) at 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 $ Response.execute(HttpConnection.java:540) at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:227) at org.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.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:234) at java.util.concu rrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 在 java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:588) 在java.lang.Thread.run(Thread.java:818)

+1

您的应用程序没有按没有'android.permission.INTERNET'权限。您需要将此权限添加到应用程序的清单中,或者在应用程序的运行时期间询问它。 – Titus

+1

可能重复[SecurityException:权限被拒绝(缺少INTERNET权限?)](http://stackoverflow.com/questions/17360924/securityexception-permission-denied-missing-internet-permission) – Ziem

回答

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

非常感谢。有效。 – Elijah

3

您必须将Internet权限添加到清单。

<uses-permission android:name="android.permission.INTERNET" /> 
+0

谢谢。与此permision我的应用程序没有崩溃,但textview无法显示结果呢! – Elijah

+0

请将此答案投票并选择该答案作为结果...谢谢。 – Horm