2013-04-05 34 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