Jsoup和线程错误 [英] Jsoup and thread error
本文介绍了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屋!
查看全文