Java 在Android上使用Jsoup的线程问题
我有以下代码,其中我尝试连接到google.com并解析该网站上的文本:Java 在Android上使用Jsoup的线程问题,java,android,jsoup,Java,Android,Jsoup,我有以下代码,其中我尝试连接到google.com并解析该网站上的文本: package com.example.parsetest; import java.io.IOException; import org.jsoup.*; import org.jsoup.nodes.Document; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.wi
package com.example.parsetest;
import java.io.IOException;
import org.jsoup.*;
import org.jsoup.nodes.Document;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
Thread downloadThread = new Thread() {
public void run() {
Document doc;
try {
doc = Jsoup.connect("http://google.com/").get();
String title = doc.title();
TextView console = (TextView) findViewById(R.id.textview1);
console.setText(title);
} catch (IOException e) {
e.printStackTrace();
}
}
};
}
我的问题是,我不确定是否正确创建了新线程,以及应该在哪里调用downloadThread.start()
from-我应该创建一个新类吗?还是从onCreate方法调用它?签出
AsyncTask允许正确且轻松地使用UI线程。此类允许在UI线程上执行后台操作和发布结果,而无需操纵线程和/或处理程序
下载地点为
我不确定我是否正确创建了新线程
是的,您以正确的方式创建了线程,但在run方法中,您正在更新TextView文本,这是无效的,因为只有主线程更新了ui元素,而不是任何其他线程。您应该使用runOnUiThread
更新文本视图:
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
TextView console = (TextView) findViewById(R.id.textview1);
console.setText(title);
}
});
建议的方法是使用
我应该从哪里调用downloadThread.start()
在
setContentView之后的onCreate活动中,您应该调用downloadThread.start()
是的,您需要调用downloadThread.start()
。无法从后台线程更新ui。使用runOnUiThread
public class MainActivity extends Activity {
TextView console;
String title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
console = (TextView) findViewById(R.id.textView1);
new Thread() {
public void run() {
Document doc;
try {
doc = Jsoup.connect("http://google.com/").get();
title = doc.title();
runOnUiThread( new Runnable()
{
public void run()
{
console.setText(title); // set text on the ui thread
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
正如其他人所建议的,使用asynctask更容易
使用AsyncTask
public class MainActivity extends Activity {
TextView console;
String title;
ProgressDialog pd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pd = new ProgressDialog(this);
pd.setMessage("Jsoup parsing...");
console = (TextView) findViewById(R.id.textView1);
new TheTask().execute();
}
class TheTask extends AsyncTask<Void,String,String>
{
@Override
protected String doInBackground(Void... arg0) {
// TODO Auto-generated method stub
Document doc;
try {
doc = Jsoup.connect("http://google.com/").get();
title = doc.title();
}
catch(Exception e)
{
e.printStackTrace();
}
return title;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
pd.dismiss();
console.setText(title);
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pd.show();
}
}
}
公共类MainActivity扩展活动{
文本视图控制台;
字符串标题;
进展性帕金森病;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pd=新进度对话框(本);
setMessage(“Jsoup解析…”);
控制台=(TextView)findViewById(R.id.textView1);
新建任务().execute();
}
类任务扩展异步任务
{
@凌驾
受保护的字符串doInBackground(无效…arg0){
//TODO自动生成的方法存根
文件文件;
试试{
doc=Jsoup.connect(“http://google.com/).get();
title=doc.title();
}
捕获(例外e)
{
e、 printStackTrace();
}
返回标题;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
pd.解散();
console.setText(标题);
}
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
pd.show();
}
}
}
是,您需要在ui线程上调用downloadThread.start()
和这个console.setText(title)