2013-04-05 1 views
1

바로이 부분까지 생각하면 나를 완전히 멍청한 사람이라고 생각해야합니다. 나는 머리를 쓰고 있습니다.안드로이드, 비동기 작업을 사용하여 URL에서 텍스트를 가져 오는 것

나는 내가하고 싶은 다른면을 다루는 몇 가지 부분적인 튜토리얼에서 내가 이것에 대해 이해하고있는 것을 자갈로 만들려고 시도했다.

길고 짧게, 내가 원한다면 텍스트를 텍스트보기에서 표시하기 위해 URL을 읽는 것이 좋습니다. 제 생각에 3.0 업데이트 이후에는 AsyncTask가 필요합니다.

오류의 원인과 해결 방법을 이해할 수 없으므로 잘못된 정보가 도움이 될 것입니다.

doInBackground의 try 및 catch에 포함 된 코드가 3.0 업데이트 전에 자체적으로 작동한다는 것을 알고 있습니다. 이것도 비동기와 함께 작동하도록 수정해야하는지는 모르지만 저는 잘 모릅니다.

또 다른 이슈가 발생하면 아마이 문제가 발생할 것이라고 생각합니다. 만약 누군가가 눈에 띄게 뭔가 분명하게 지적한다면, 당신이 그것을 지적 할 수 있다면 감사 할 것입니다.

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; 
    } 


} 

는 그리고 로그 캣 오류는 다음과 같습니다

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

웹에서 데이터를 가져 오는 AsyncTask에 대해 더 자세히 설명하는 일부 소스 코드의 비디오 연습은 https://www.youtube.com/watch?v=JqFkkXMwWDg를 참조하십시오. 다행히도 시청 한 후에 어떻게 작동하는지, 왜 작동하는지 더 잘 알 수 있습니다. 답장을 보내 – FoamyGuy

답변

5

여기

eventText.setText("" + HTML); 

이 줄은 문제를 일으키는 것입니다. UIdoInBackground()에서 업데이트 할 수 없습니다. 다른 방법들 중 하나에서 수행되거나 메인 Activity 방법으로 다시 전송되어야합니다. 여기에 당신이 이것을 달성 여러 가지 방법이 있습니다 onPostExecute()

Read through the AyncTask Docs

에 그것을 할 수 있지만 다음 onPostExecute() 방법을 추가 onPostExecute()

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

에 결과를 반환하기 위해 AsyncTask을 변경에 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} 하지만 지금은 당신을 환영합니다 –

+1

아무것도하지 않습니다. 다행스럽게도 도움이 될 수 있습니다. – codeMagic

+0

아무 일도 일어나지 않았습니다. 아무 것도 반환되지 않고 오류가 발생하지 않습니다. –

관련 문제