2013-04-05 36 views
1

正確的我認爲就此而言,您應該認爲我是一個完整的noob,我在我的頭上。Android,使用異步任務從url抓取文本

我試圖從幾個部分教程中拼湊出我對它的理解,每個部分教程都涉及到我想要做的不同方面。

它的長短,我想要做的就是從URL中讀取文本以顯示在文本視圖中,我的理解是,自3.0更新以來,我需要一個AsyncTask來執行此操作。

任何幫助我出錯的地方都會很好,因爲我不明白是什麼導致了錯誤以及如何解決。

我知道,在3.0更新之前,doInBackground的try和catch中包含的代碼可以自行工作。不過,我也不知道這是否也需要修改才能使用Async。

我也想像其他問題可能會出現,一旦這個排序,如果有人發現明顯不明顯的東西,我會很感激,如果你能指出。

String Event; 
TextView eventText; 
TextView titleText; 

String HTML; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.newevent); 

    titleText = (TextView) findViewById(R.id.Title); 
    eventText = (TextView) findViewById(R.id.Event); 

    new eventupdate().execute(); 


} 

public class eventupdate extends AsyncTask<String, Void, Void> { 

    @Override 
    protected Void doInBackground(String... url) { 

     try { 

      Thread.sleep(4000);     

      HttpClient httpClient = new DefaultHttpClient(); 
      HttpContext localContext = new BasicHttpContext(); 
      HttpGet httpGet = new HttpGet(
        "http://masterzangetsu.eu/Apps/rocksoctest"); // URL! 
      HttpResponse response = httpClient.execute(httpGet, 
        localContext); 
      String result = ""; 

      BufferedReader reader = new BufferedReader(
        new InputStreamReader(response.getEntity().getContent())); 

      String line = null; 
      while ((line = reader.readLine()) != null) { 
       result += line + "\n"; 
       HTML = result; 
      } 

     } catch (InterruptedException e) { 

      e.printStackTrace(); 


     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     eventText.setText("" + HTML); 

     // TODO Auto-generated method stub 
     return null; 
    } 


} 

而且logcat的錯誤是:

W/dalvikvm(394): threadid=9: thread exiting with uncaught exception (group=0x40015560) 
E/AndroidRuntime(394): FATAL EXCEPTION: AsyncTask #1 
E/AndroidRuntime(394): java.lang.RuntimeException: An error occured while executing doInBackground() 
E/AndroidRuntime(394): at android.os.AsyncTask$3.done(AsyncTask.java:200) 
E/AndroidRuntime(394): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
E/AndroidRuntime(394): at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
E/AndroidRuntime(394): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
E/AndroidRuntime(394): at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
E/AndroidRuntime(394): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
E/AndroidRuntime(394): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
E/AndroidRuntime(394): at java.lang.Thread.run(Thread.java:1019) 

E/AndroidRuntime(394): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 

E/AndroidRuntime(394): at android.view.ViewRoot.checkThread(ViewRoot.java:2932) 
E/AndroidRuntime(394): at android.view.ViewRoot.requestLayout(ViewRoot.java:629) 
E/AndroidRuntime(394): at android.view.View.requestLayout(View.java:8267) 
E/AndroidRuntime(394): at android.view.View.requestLayout(View.java:8267) 
E/AndroidRuntime(394): at android.view.View.requestLayout(View.java:8267) 
E/AndroidRuntime(394): at android.view.View.requestLayout(View.java:8267) 
E/AndroidRuntime(394): at android.widget.ScrollView.requestLayout(ScrollView.java:1291) 
E/AndroidRuntime(394): at android.view.View.requestLayout(View.java:8267) 
E/AndroidRuntime(394): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257) 
E/AndroidRuntime(394): at android.view.View.requestLayout(View.java:8267) 
E/AndroidRuntime(394): at android.widget.TextView.checkForRelayout(TextView.java:5521) 
E/AndroidRuntime(394): at android.widget.TextView.setText(TextView.java:2724) 
E/AndroidRuntime(394): at android.widget.TextView.setText(TextView.java:2592) 
E/AndroidRuntime(394): at android.widget.TextView.setText(TextView.java:2567) 
E/AndroidRuntime(394): at com.MasterZangetsu.kentrocksoc.nextEvent$eventupdate.doInBackground(nextEvent.java:81) 
E/AndroidRuntime(394): at com.MasterZangetsu.kentrocksoc.nextEvent$eventupdate.doInBackground(nextEvent.java:1) 
E/AndroidRuntime(394): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
E/AndroidRuntime(394): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
+0

見這裏:https://www.youtube.com/watch?v=JqFkkXMwWDg視頻演練一些源代碼,更詳細地解釋了AsyncTask從網上拉取數據。希望在看完之後,你會更好地瞭解它的工作原理和原理。 – FoamyGuy 2013-04-05 13:40:37

回答

5

這裏

eventText.setText("" + HTML); 

此行是造成您的問題。您無法從doInBackground()更新UI。它必須用其他方法之一來完成,或者發回主要的方法Activity。在這裏,你能做到這一點的onPostExecute()

Read through the AyncTask Docs

實現這一點有不同的方式,但你可以改變你的AsyncTask到結果返回到onPostExecute()

public class eventupdate extends AsyncTask<String, Void, String> // change last param 

再加入onPostExecute()方法和改變return聲明doInBackground()

public class eventupdate extends AsyncTask<String, Void, String> 

@Override 
protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     eventText.setText("" + result); 
} 

@Override 
    protected String doInBackground(String... url) { 
    // do your work 
    return HTML; 
+0

感謝您的回覆,我說行至 保護無效onPostExecute(){ \t \t \t \t \t \t eventText.setText( 「」 + HTML); \t \t \t \t \t} 但現在什麼都不做 – 2013-04-05 13:45:55

+1

歡迎您。很高興我可以幫助 – codeMagic 2013-04-05 13:47:07

+0

沒有,因爲在沒有任何反應......沒有任何回報,我沒有得到任何錯誤 – 2013-04-05 13:51:56