2012-01-19 3 views
0

이것은 내 코드입니다. 내 앱 로고를 클릭하면 스플래시 화면 다음에 인 텐트에서 처음 호출 된 클래스입니다. 그러나 탭이로드되고 onPreExecute()가 한 번 실행되면 앱이 다운됩니다.이 Android 코드에서 앱이 다운되는 오류가 무엇인가요?

public class HomeActivity extends Activity{ 
    private static final String dialog = null; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.user_main_tab_home); 

     new HomeDownloadPage().execute(); 
    } 


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

     private final ProgressDialog dialog = new ProgressDialog(HomeActivity.this); 




     protected void onPreExecute() { 
      this.dialog.setMessage("Have Paitence! "); 
      this.dialog.show(); 


      } 

     @Override 
      protected String doInBackground(String... params) { 

       User user = null; 

       try { 


         user = new User("4eeb"); 
         user.getList(); 

         /* 
         * Custom adapter 
         * */ 
         ArrayList<User> users = new ArrayList<User>(); 

         for(User u : user.following){ 
          users.add(u); 
         } 

         ListView lv = (ListView) findViewById(R.id.user_list); 

         final UserFollowingListAdapter csl = new UserFollowingListAdapter(HomeActivity.this,R.layout.user_list,users,this); 


         OnItemClickListener listener = new OnItemClickListener() { 

          public void onItemClick(AdapterView<?> parent, View view, int position,long id) { 

          Object o = csl.getItem(position); 


          setTitle(parent.getItemAtPosition(position).toString()); 
          } 
          }; 

          lv.setAdapter(csl); 


          lv.setOnItemClickListener(listener); 


          /* 
          * Onclick listener 
          * */  
          lv.setOnItemClickListener(new OnItemClickListener() { 
             @Override 
             public void onItemClick(AdapterView<?> parent, View view,int position, long id) { 
              Intent i = new Intent("com.list.SEARCH"); 
              Toast.makeText(HomeActivity.this, "rowitem clicked", Toast.LENGTH_LONG).show(); 
              // TODO Auto-generated method stub 

             } 
            }); 

         } catch (Exception e) { 

           showError(); 
         } 
       return null; 
      } 

     protected void onPostExecute(String result) { 
       // execution of result of Long time consuming operation 

       } 

    } 

       public void showError(){ 
        new AlertDialog.Builder(HomeActivity.this) 
        .setTitle(" Oops , Server down :(") 
        .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 

         @Override 
         public void onClick(DialogInterface arg0, int arg1) { 
          // TODO Auto-generated method stub 

         } 
         // 
        }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          // Do nothing. 
         } 
        }).show(); 

       } 




     } 

오류받는 사람이 doInBackground() 함수에 있습니다.

정확한 오류 : 01-19 19 : 03 : 01.264 : E/AndroidRuntime (1138) : java.lang.RuntimeException가 :에 의한 스레드 내부 핸들러를 만들 수 없습니다 Looper.prepare라고하지 않았 음()

무엇이 문제입니까?

+0

유사 http://stackoverflow.com/questions/3875184/cant-create-handler-inside-thread-that-has-not-called-looper-prepare와 유사합니다. – MikeTheReader

답변

1

백그라운드 스레드에서 UI (ListView lv = (ListView) findViewById(R.id.user_list);)와 관련된 작업을 시도하고 있습니다. 너는 이것을 못해. 백그라운드에서 정보를 처리 한 다음 UI 스레드로 다시 전달하고 UI를 업데이트 할 수 있습니다.

1

pyrodante가 말했듯이 UI 스레드가 아니라 UI를 수정하려고합니다. UI가 아닌 스레드에서 UI를 수정하려면 runOnUiThread() 함수를 사용할 수 있습니다. 즉, 문제에 대한 더 나은 해결책이 있습니다. 정말로 Loader을 사용해야합니다. 그들은 기본적으로 당신이하려고하는 것을 정확히 처리하도록 설계되었습니다. 3.0 이전 버전의 앱을 디자인하더라도 Android Support package을 통해 로더에 계속 액세스 할 수 있습니다.

관련 문제