2013-07-03 5 views
0

J'utilise un gridview dans un fragment. Je charge le gridview dans doInBackground. Cependant, je reçois AsyncTask # 1 Fatal Exception. Ci-dessous le code que j'ai essayé:gridview dans doInBackground donnant l'exception AsyncTask

public class Home extends Fragment implements TabHost.OnTabChangeListener, 
     OnClickListener { 

    TabHost tabHost; 
    View vi; 
    StaggeredAdapter adapter; 
    TextView tv; 
    public String urls[] = { 

    "http://farm9.staticflickr.com/8462/8005636463_0cb4ea6be2.jpg", 
      "http://farm8.staticflickr.com/7232/6913504132_a0fce67a0e_c.jpg", 
      "http://farm5.staticflickr.com/4133/5096108108_df62764fcc_b.jpg", 
      "http://farm5.staticflickr.com/4074/4789681330_2e30dfcacb_b.jpg", 
      "http://farm9.staticflickr.com/8208/8219397252_a04e2184b2.jpg", 
      "http://farm9.staticflickr.com/8483/8218023445_02037c8fda.jpg", 
      "http://farm9.staticflickr.com/8335/8144074340_38a4c622ab.jpg", 
      "http://farm9.staticflickr.com/8060/8173387478_a117990661.jpg", 
      "http://farm9.staticflickr.com/8056/8144042175_28c3564cd3.jpg", 
      "http://farm9.staticflickr.com/8183/8088373701_c9281fc202.jpg", 
      "http://farm9.staticflickr.com/8185/8081514424_270630b7a5.jpg", 
      "http://farm9.staticflickr.com/8462/8005636463_0cb4ea6be2.jpg", 
      "http://farm9.staticflickr.com/8306/7987149886_6535bf7055.jpg", 
      "http://farm9.staticflickr.com/8444/7947923460_18ffdce3a5.jpg", 
      "http://farm9.staticflickr.com/8182/7941954368_3c88ba4a28.jpg", 
      "http://farm9.staticflickr.com/8304/7832284992_244762c43d.jpg", 
      "http://farm9.staticflickr.com/8163/7709112696_3c7149a90a.jpg", 
      "http://farm8.staticflickr.com/7127/7675112872_e92b1dbe35.jpg", 
      "http://farm8.staticflickr.com/7111/7429651528_a23ebb0b8c.jpg", 
      "http://farm9.staticflickr.com/8288/7525381378_aa2917fa0e.jpg", 
      "http://farm6.staticflickr.com/5336/7384863678_5ef87814fe.jpg", 
      "http://farm8.staticflickr.com/7102/7179457127_36e1cbaab7.jpg", 
      "http://farm8.staticflickr.com/7086/7238812536_1334d78c05.jpg", 
      "http://farm8.staticflickr.com/7243/7193236466_33a37765a4.jpg", 
      "http://farm8.staticflickr.com/7251/7059629417_e0e96a4c46.jpg", 
      "http://farm8.staticflickr.com/7084/6885444694_6272874cfc.jpg" }; 

    public static final String ARG_SECTION_NUMBER = "section_number"; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     vi = inflater.inflate(R.layout.home, container, false); 
     Button iv = (Button) vi.findViewById(R.id.btnMoreDialog); 
     iv.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       PopupMenu homepopup = new PopupMenu(getActivity(), v); 

       MenuInflater inflater = homepopup.getMenuInflater(); 

       inflater.inflate(R.menu.moredialog, homepopup.getMenu()); 

       homepopup.show(); 

      } 
     }); 


     new Dialogs().execute(urls); 
     return vi; 
    } 

    private class Dialogs extends AsyncTask<String[] , Void, Void> 
    { 
     @Override 
     protected Void doInBackground(String[]... params) { 
      StaggeredGridView gridView = (StaggeredGridView) vi 
        .findViewById(R.id.staggeredGridView1); 

      int margin = getResources().getDimensionPixelSize(R.dimen.margin); 
      gridView.setItemMargin(margin); 
      gridView.setPadding(margin, 0, margin, 0); 

      // StaggeredAdapter adapter = new StaggeredAdapter(MainActivity.this, 
      // R.id.photoimageview, urls, R.layout.row_staggered_demo); 

      StaggeredAdapter adapter = new StaggeredAdapter(vi.getContext(), 
        R.id.photoimageview, params[0], R.layout.row_staggered_demo); 

      gridView.setAdapter(adapter); 

      return null; 
     } 


     @Override 
     protected void onPostExecute(Void result) { 


     } 
     @Override 
     protected void onPreExecute() { 


     } 

    } 

} 

Des idées? Merci,

+1

afficher la trace de pile. – Raghunandan

Répondre

1

Vous essayez de mettre à jour l'interface utilisateur dans doInbackground, ce qui n'est pas possible.

 gridView.setAdapter(adapter); 

Vous devez mettre à jour l'interface utilisateur sur le thread ui.

utilisation runOnUiThread mise à jour d'ui en onPostExecute

 getActivity().runOnUiThread(new Runnable() //run on ui thread 
       { 
        public void run() 
        { 

       } 
       }); 
+0

J'ai essayé vos suggestions mais je reçois l'application peut-être faire trop de travail sur le fil principal. Le gridview n'est pas affiché et le pop-menu sur cet écran ne fonctionne pas non plus. – asifa

+0

cela signifie que votre application fait trop de travail sur le thread ui principal. vous devrez déplacer certaines tâches dans un thread. vous ne le faites pas bien. – Raghunandan

+0

Le code affiché ci-dessus est mon code d'écran. J'ai trois boutons et gridview sur cette page. Sur le clic d'un des boutons j'affiche un menu instantané et le gridview sur le chargement. L'application ne donne aucune erreur – asifa

Questions connexes