Jsoup和线程错误 [英] Jsoup and thread error

查看:130
本文介绍了Jsoup和线程错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我看jsoup库和我写的这个简单的$ C $下看它是如何工作的:

 公共类MainActivity延伸活动{

@覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);
    downloadThread.start();

}

螺纹downloadThread =新的Thread(){
    @覆盖
    公共无效的run(){
        TextView的TW =(TextView中)findViewById(R.text_view.tw1);
        文档文档;
        尝试 {
            DOC = Jsoup.connect(http://www.google.it)获得();
            tw.setText(doc.title());
        }赶上(IOException异常E){
            // TODO自动生成的catch块
            e.printStackTrace();
        }
    }
};
 

和我这个元素添加到AndroidManifest.xml中

 <使用,许可
    机器人:名称=android.permission.INTERNET对/>
 

但是,当我启动的软件,我有序贯错误:

  04-27 17:25:49.801:E / AndroidRuntime(26035):致命异常:螺纹2004
04-27 17:25:49.801:E / AndroidRuntime(26035):
android.view.ViewRootImpl $ CalledFromWrongThreadException:只有原来的线程
创建一个视图层次可以触摸自己的看法。
04-27 17:25:49.801:E / AndroidRuntime(26035):在
android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746)
04-27 17:25:49.801:E / AndroidRuntime(26035):在
android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:854)
04-27 17:25:49.801:E / AndroidRuntime(26035):在
android.view.ViewGroup.invalidateChild(ViewGroup.java:4075)
04-27 17:25:49.801:E / AndroidRuntime(26035):在
android.view.View.invalidate(View.java:10386)
04-27 17:25:49.801:E / AndroidRuntime(26035):在
android.view.View.invalidate(View.java:10341)
04-27 17:25:49.801:E / AndroidRuntime(26035):在
android.widget.TextView.checkForRelayout(TextView.java:6439)
04-27 17:25:49.801:E / AndroidRuntime(26035):在
android.widget.TextView.setText(TextView.java:3696)
04-27 17:25:49.801:E / AndroidRuntime(26035):在
android.widget.TextView.setText(TextView.java:3554)
04-27 17:25:49.801:E / AndroidRuntime(26035):在
android.widget.TextView.setText(TextView.java:3529)
04-27 17:25:49.801:E / AndroidRuntime(26035):在
com.example.webparsingtest.MainActivity $ 1.运行(MainActivity.java:30)
 

解决方案

您不能从线程中的主线程不同的访问UI组件的。

 公共类MainActivity延伸活动{

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        新ExampleAsyncTask()执行()。
    }

    静态类ExampleAsyncTask扩展的AsyncTask<虚空,虚空,字符串> {

        @覆盖
        保护字符串doInBackground(空...未使用){
            文档文档;
            尝试 {
                DOC = Jsoup.connect(http://www.google.it)获得();
                返回doc.title();
            }赶上(IOException异常E){
                返回null;
            }
        }

        @覆盖
        保护无效onPostExecute(字符串名称){

            如果(标题== NULL){
                Toast.makeText(MainActivity.this,错误,Toast.LENGTH_SHORT).show();
                返回;
            }

            TextView的TW =(TextView中)findViewById(R.text_view.tw1);
            tw.setText(职称);
        }
    }

}
 

I'm looking at jsoup libraries and i've write this simple code for watching how does it works:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    downloadThread.start();

}

Thread downloadThread = new Thread() {
    @Override
    public void run() {
        TextView tw = (TextView) findViewById(R.text_view.tw1);
        Document doc;
        try {
            doc = Jsoup.connect("http://www.google.it").get();
            tw.setText(doc.title());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
};

And i've add this element to AndroidManifest.xml

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

But when i launch software, i have the sequent error:

04-27 17:25:49.801: E/AndroidRuntime(26035): FATAL EXCEPTION: Thread-2004
04-27 17:25:49.801: E/AndroidRuntime(26035):   
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that   
created a view hierarchy can touch its views.
04-27 17:25:49.801: E/AndroidRuntime(26035):    at   
android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746)
04-27 17:25:49.801: E/AndroidRuntime(26035):    at   
android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:854)
04-27 17:25:49.801: E/AndroidRuntime(26035):    at  
android.view.ViewGroup.invalidateChild(ViewGroup.java:4075)
04-27 17:25:49.801: E/AndroidRuntime(26035):    at  
android.view.View.invalidate(View.java:10386)
04-27 17:25:49.801: E/AndroidRuntime(26035):    at  
android.view.View.invalidate(View.java:10341)
04-27 17:25:49.801: E/AndroidRuntime(26035):    at  
android.widget.TextView.checkForRelayout(TextView.java:6439)
04-27 17:25:49.801: E/AndroidRuntime(26035):    at    
android.widget.TextView.setText(TextView.java:3696)
04-27 17:25:49.801: E/AndroidRuntime(26035):    at  
android.widget.TextView.setText(TextView.java:3554)
04-27 17:25:49.801: E/AndroidRuntime(26035):    at 
android.widget.TextView.setText(TextView.java:3529)
04-27 17:25:49.801: E/AndroidRuntime(26035):    at 
com.example.webparsingtest.MainActivity$1.run(MainActivity.java:30)

解决方案

You cannot access to UI components from threads different from the main thread.

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new ExampleAsyncTask().execute();
    }

    static class ExampleAsyncTask extends AsyncTask<Void, Void, String> {

        @Override
        protected String doInBackground(Void... unused) {
            Document doc;
            try {
                doc = Jsoup.connect("http://www.google.it").get();
                return doc.title();
            } catch (IOException e) {
                return null;
            }
        }

        @Override
        protected void onPostExecute(String title) {

            if(title == null){
                Toast.makeText(MainActivity.this, "error", Toast.LENGTH_SHORT).show();
                return;
            }

            TextView tw = (TextView) findViewById(R.text_view.tw1);
            tw.setText(title);
        }
    }

}

这篇关于Jsoup和线程错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆