0

我正在尝试从网站获取 html 数据,现在只是将 textview 更改为网页的标题。出于某种原因,此文本视图仅在我退出应用程序并重新打开它时才显示标题。我猜这是由于线程和我不知道的事情。例如,这是我在 stackoverflow.com 网站上的代码:

public void onResume() {
    super.onResume();

    Thread downloadThread = new Thread() {
        public void run() {
            Document doc;
            try {
                doc = Jsoup.connect("http://www.stackoverflow.com").get();
                titlestring = doc.title();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };
    downloadThread.start();

    TextView maintext = (TextView) findViewById(R.id.maintext);

    Log.i("wbbug", "Title string: " + titlestring);
    maintext.setText(titlestring);

}

出于某种原因,在我启动应用程序,按主页,然后重新打开它之前,它不会显示网页的标题。为什么是这样?

4

2 回答 2

1

您正在后台线程中加载网页(这很好),无需等待 HTTP 请求完成,您就titlestring假设它包含网页的标题,但情况并非如此。

尝试这个:

TextView maintext = (TextView)findViewById(R.id.maintext);
Thread downloadThread = new Thread() {                         
    public void run() {                                        
        Document doc;                                          
        try {                                              
            final Document doc = Jsoup.connect("http://www.stackoverflow.com").get();
            maintext.post(new Runnable(){
                maintext.setText(doc.title());
            });
        } catch (IOException e) {                       
            e.printStackTrace();                        
        }                                                       
    }                                                   
};                                                      
downloadThread.start();

获取文档后为 textview 设置文本。NotesetText()对 UI 组件进行操作,因此您必须maintext.setText()在 UI 线程中进行操作,这View.post()是在 UI 线程中运行代码的几种方式之一。

于 2013-07-15T04:56:50.220 回答
1

尝试这个:

TextView maintext = (TextView) findViewById(R.id.maintext);
 Thread downloadThread = new Thread() {
        public void run() {
            Document doc;
            try {
                doc = Jsoup.connect("http://www.stackoverflow.com").get();
                titlestring = doc.title();

             runOnUiThread(new Runnable()
                     {
                       run(){
                    Log.i("wbbug", "Title string: " + titlestring);
                    maintext.setText(titlestring);
                            }
                     }

                } catch (IOException e) {
                e.printStackTrace();
                }
        }
    };
    downloadThread.start();

maintext.setText()在获得页面标题之前调用,但在第二次调用时titlestring已经使用您的值启动并setText获取您的页面名称。

于 2013-07-15T05:13:30.093 回答