2013-06-03 24 views
1

和我認爲我做錯了什麼事螺紋 程序啓動時沒有任何錯誤。文本視圖不顯示我是新來的Java和Andriod的任何文本

我插入了一個按鈕只是爲了測試,它顯示沒有問題。文本視圖甚至不會顯示「Hello world」默認字符串。

下面是代碼

package com.example.studentservis; 

    import android.R.string; 
    import android.os.AsyncTask; 
    import android.os.Bundle; 
    import android.os.Handler; 
    import android.os.Message; 
    import android.app.Activity; 
    import android.view.Menu; 
    import android.widget.TextView; 
    import java.net.*; 
    import java.util.ArrayList; 
    import java.util.Iterator; 
    import java.util.List; 
    import java.io.*; 
    import org.jsoup.Jsoup; 
    import org.jsoup.nodes.Document; 
    import org.jsoup.nodes.Element; 
    import org.jsoup.select.Elements; 
    import org.w3c.dom.Text; 

    public class MainActivity extends Activity { 

     StringHandler stringHandler = new StringHandler(); 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      thread.run(); 

      TextView txtView = (TextView)this.findViewById(R.id.textView1); 
      txtView.setText(stringHandler.getString()); 

     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      // Inflate the menu; this adds items to the action bar if it is present. 
      getMenuInflater().inflate(R.menu.activity_main, menu); 


      return true; 
     } 

     Thread thread = new Thread(){ 
      public void run(){ 
       try { 

        stringHandler.setString(webRequest()); 


       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        stringHandler.setString(e.getMessage()); 
       } 
      } 
     }; 


     public String webRequest() throws Exception{ 
      String servisURL = "http://www.sczg.unizg.hr/student-servis/"; 
      Document doc = Jsoup.connect(servisURL).get(); 
      Elements jobNode = doc.select("div.jobBox"); 

      return jobNode.get(0).text(); 
     } 

     public class StringHandler 
     { 
      public String str = "test"; 

      public void setString(String s) 
      { 
       str = s; 
      } 

      public String getString() 
      { 
       return str; 
      } 
     } 



    } 

回答

1

您可以使用一個處理器或asyctask用於這一目的。 Asynctask更容易。

http://developer.android.com/reference/android/os/AsyncTask.html

您可以創建自己的線程,但記得要在UI線程上更新UI。

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".MainActivity" > 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="166dp" 
    android:text="Loading..." /> 

    </RelativeLayout> 

MainActivity.java

移除StringHandler因爲我認爲這是在這種情況下是不必要的。

public class MainActivity extends Activity { 

TextView txtView ; 
String s; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    txtView = (TextView)this.findViewById(R.id.textView1); // initialize textview 
    //txtView.setText(stringHandler.getString()); 
    new Thread(new Runnable() { // thread 
     @Override 
     public void run(){ 

      try { 
       s = webRequest(); // get string 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      runOnUiThread(new Runnable() //run on ui threa 
      { 
       public void run() 
       { 
        txtView.setText(s); // update ui on the ui thread. 
       } 
      }); 


     } 
}).start(); 


} 

public String webRequest() throws Exception{ // web request 
    String servisURL = "http://www.sczg.unizg.hr/student-servis/"; 
    Document doc = Jsoup.connect(servisURL).get(); 
    Elements jobNode = doc.select("div.jobBox"); 

    return jobNode.get(0).text(); 
} 
} 

得到的抽點

enter image description here

+0

他沒有從另一個線程更新UI線程。他從UI線程更新了UI。這不是問題。問題是,當他想更新用戶界面的新線程還沒有完成,並沒有數據準備 –

+1

@MiroMarkarian同意我更新了我的答案,如果你已經downvoted你可以刪除現在 – Raghunandan

+0

好吧。但無論如何,這是相同的我的回答:) –

1

你的這部分代碼:txtView.setText(stringHandler.getString());

應該線程結束後付諸表決。

 thread.run(); <------ Start running thread in background 

     TextView txtView = (TextView)this.findViewById(R.id.textView1); 
     txtView.setText(stringHandler.getString()); 
     // the textView was set without knowing whether the Thread is finished or not. 
     // thus, textView is shown as empty, because stringHandler.getString() still has empty string 

我的建議是,你實現它的asyncTask裏面,這樣你可以在設置文本onPostExecute()

好運^^

編輯: 這裏的一些例子的AsyncTask

private class StringSet extends AsyncTask <Void,Void,Void> { 

@Override 
protected void doInBackground(Void... params) { 

    try { 
     stringHandler.setString(webRequest()); 
    } catch (Exception e) { 
     stringHandler.setString(e.getMessage()); 
    } 
} 

@Override 
protected void onPostExecute(Void... results) { 
    txtView.setText(stringHandler.getString()); 
    } 
} 

並替換thread.run()new StringSet().execute();

+0

我不知道如何實現你的代碼。我在'protected void doInBackground(Void ... params)'和'protected void onPostExecute(Void ... results)上得到錯誤' – imot01

+0

你在eclipse IDE上編輯了代碼,對嗎?然後你需要的就是寫'private嘗試在'asyncTask'類中按Alt + Shift + S並選擇'Override/Implement methods',然後選擇'Override/Implement methods',然後選擇' ''doInBackground''和'onPostExecute'你應該可以做到^^ – reidzeibel

2

當你開始一個新的線程,UI線程不會等到新線程完成。這是線程的目的。

這裏:

thread.run(); 

當您啓動新的線程來更新stringHandler,UI線程嘗試處理下一個命令是:

txtView.setText(stringHandler.getString()); 

當UI線程到達這個,stringHandler尚未更新,所以它是空的,因此它將在textview中不顯示任何內容。

所有你應該做的是嘗試的時候,它的完成從新線程更新的TextView。

試試這個:

Thread thread = new Thread(){ 
    public void run(){ 
     try { 

      stringHandler.setString(webRequest()); 


     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      stringHandler.setString(e.getMessage()); 
     } 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       TextView txtView = (TextView)this.findViewById(R.id.textView1); 
       txtView.setText(stringHandler.getString()); 
      } 
     }); 
    } 
}; 
+0

我可以在'stringHandler.setString(webRequest())之後加'thread.join();''?加入停止線程,對吧? – imot01

+0

加入暫停當前線程並等待另一個線程完成。這不僅僅是一個好主意。因爲這會讓你的用戶界面無響應(=應用程序掛起,不會響應用戶交互)。我不會推薦 –

+0

如果你真的想在'threadHandler.setString(webRequest());'後面使用'thread.start()';' –

相關問題