Java 在Android上使用Jsoup的线程问题

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

我有以下代码,其中我尝试连接到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.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)