2012-01-19 4 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()関数にアクセスしました。

正確なエラー:1月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からローダーにアクセスできます。

関連する問題