2012-07-13 6 views
2

나는 두 개의 탭을 바꾸기 위해 FragmentActivity을 사용하고 있습니다. 그것은 탭 A와 탭 B입니다. TabmoreB에서 loadmore 버튼을 사용하여 ListView을 사용하고 있는데, loadmore 버튼을 클릭했을 때 방금 backgroud thread라고 불렀습니다.안드로이드 조각 및 스레드

private class loadMoreListView extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected void onPreExecute() { 
     // Showing progress dialog before sending http request 
     pDialog = new ProgressDialog (
       getActivity()); 
     pDialog.setMessage("Please wait.."); 
     pDialog.setIndeterminate(true); 
     pDialog.setCancelable(false); 
     pDialog.show(); 
    } 

    protected Void doInBackground(Void... unused) { 
     try { 
      //service url to fectch data.. 
      //xml parsing 
     } catch (Exception e) { 
      response = "failure"; 
      System.out.println(" sec XML Pasing Excpetion = " + e); 
     } 

     int currentPosition = listViewattlist.getFirstVisiblePosition(); 

     // Appending new data to menuItems ArrayList 
     adapter = new CustomAdapter(getActivity(), R.layout.att_list, R.id.title, data); 
     listViewattlist.setAdapter(adapter); 

     // Setting new scroll position 
     listViewattlist.setSelectionFromTop(currentPosition + 1, 0); 
     return (null); 
    } 

    protected void onPostExecute(Void unused) { 
     // closing progress dialog 
     pDialog.dismiss(); 
    } 
} 

내가 교환 및 버튼 내가 진행 막대를 볼 수 받았음을 클릭하지만 아래와 같은 오류를 보여줍니다

07-13 11:42:29.386: E/AndroidRuntime(894): FATAL EXCEPTION: AsyncTask #2 
07-13 11:42:29.386: E/AndroidRuntime(894): java.lang.RuntimeException: An error occured while executing doInBackground() 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
07-13 11:42:29.386: E/AndroidRuntime(894): at java.lang.Thread.run(Thread.java:856) 
07-13 11:42:29.386: E/AndroidRuntime(894): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4607) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:867) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4066) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.View.invalidate(View.java:10250) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.View.invalidate(View.java:10205) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.widget.ImageView.invalidateDrawable(ImageView.java:190) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:350) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.graphics.drawable.Drawable.setVisible(Drawable.java:546) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.widget.ImageView.onDetachedFromWindow(ImageView.java:1173) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.View.dispatchDetachedFromWindow(View.java:11789) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2532) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:3819) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.widget.AbsListView.resetList(AbsListView.java:1936) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.widget.ListView.resetList(ListView.java:502) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.widget.ListView.setAdapter(ListView.java:442) 

07-13 11:42:29.386: E/AndroidRuntime(894): at com.owentech.testswipeab.TabTwo$loadMoreListView.doInBackground(TabTwo.java:372) 
07-13 11:42:29.386: E/AndroidRuntime(894): at com.owentech.testswipeab.TabTwo$loadMoreListView.doInBackground(TabTwo.java:1) 
07-13 11:42:29.386: E/AndroidRuntime(894): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
07-13 11:42:29.386: E/AndroidRuntime(894): ... 5 more 

------------------------------------------------------------------------ 

답변

1

당신은 별도의 스레드에서 View 객체를 건드릴 수 없어, 당신은 알고 doInBackground()은 별도의 스레드에서 실행됩니다. 따라서 ListView을 호출하면 예외가 발생합니다. View 코드를 onPostExecute()으로 이동하십시오. 희망이 도움이됩니다.

+0

내 코드에 포함 ..이 alsoi 싶지 여러분 모두 감사하는 4.0 SDK의 정적 { \t \t \t (android.os.Build.VERSION.SDK_INT> 14) \t \t \t { \t \t 경우에 \t StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder(). permitAll(). build(); \t \t \t StrictMode.setThreadPolicy (policy); \t \t \t} \t \t \t}이 버전은 더 높은 버전 4.0 에뮬레이터입니다. – Kstar

+0

@Kstar, 오신 것을 환영합니다! – Egor

0

백그라운드 스레드에서 UI를 변경할 수 없습니다.

preExceute 당신이 잘못 주요 활동 UI에 어댑터를 설정하려고하는 doInBackground에서
  • 잘 그 일을하고있다 된대로 진행 막대를 볼 수 있습니다
    1. . doInBackground는 백그라운드 프로세스를위한 것이고 기능 (@Override)에 주석을 달아주십시오.
    2. 디버깅에 대한 것 : - 로그의 오류 메시지 참조 "원인 : android.view.ViewRootImpl $ CalledFromWrongThreadException : 뷰 계층 구조를 생성 한 원래 스레드 이 라인은 실제로 당신이 잘못하고있는 것을 말했어야합니다.
  • 4

    doInBackground() 다른 스레드에서 실행됩니다. doInBackground()에서 UI 스레드에서 만든 listViewattlist을 업데이트하려고합니다. 이는 실수이므로 방법에서 listViewattlist을 업데이트해야합니다. ruuning하고 있기 때문에

    관련 문제