2013-07-16 2 views
0

J'ai une asynctask qui rassemble les commentaires, les noms d'utilisateur et les nombres d'une base de données en utilisant une méthode JSON dans la méthode doInBackground() de la asynctask. Ces tableaux sont ensuite convertis en chaînes dans la méthode onPostExecute(). Je veux que ces chaînes soient envoyées à une classe qui étend BaseAdapter, comment puis-je envoyer les chaînes à une autre classe mais toujours faire fonctionner le BaseAdapter en arrière-plan? Voici mon code actuel,Comment envoyer des variables à classer dans Asynctask - Android

class CreateCommentLists extends BaseAdapter{ 
      Context ctx_invitation; 
      String[] listComments; 
      String[] listNumbers; 
      String[] listUsernames; 


      public CreateCommentLists(Context ctx_invitation, String[] test1, String[] test2, String[] test3) 
      { 
       super(); 
       this.ctx_invitation = ctx_invitation; 
       listComments = test1; 
       listNumbers = test2; 
       listUsernames = test3; 
      } 

      @Override 
      public int getCount() { 
       // TODO Auto-generated method stub 
       return listComments.length; 
      } 

      @Override 
      public Object getItem(int position) { 
       // TODO Auto-generated method stub 
       return listComments[position]; 
      } 

      @Override 
      public long getItemId(int position) { 
       // TODO Auto-generated method stub 
       return 0; 
      } 

      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       // TODO Auto-generated method stub 
       View v = null; 
       try 
       { 
        String inflater = Context.LAYOUT_INFLATER_SERVICE; 
        LayoutInflater li = (LayoutInflater)ctx_invitation.getSystemService(inflater); 
        v = li.inflate(R.layout.list_item, null); 

        TextView commentView = (TextView)v.findViewById(R.id.listComment); 
        TextView NumbersView = (TextView)v.findViewById(R.id.listNumber); 
        TextView usernamesView = (TextView)v.findViewById(R.id.listPostedBy); 


        commentView.setText(listComments[position]); 
        NumbersView.setText(listNumbers[position]); 
        usernamesView.setText(listUsernames[position]); 
       } 
       catch(Exception e) 
       { 
        e.printStackTrace(); 
       } 
       return v; 
      } 

      } 





     final CreateCommentLists mycmlist = new CreateCommentLists(this, test1, test2, test3); 




     class loadComments extends AsyncTask<JSONObject, String, JSONObject> { 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 


      } 

      @Override 
      protected void onProgressUpdate(String... values) { 
       super.onProgressUpdate(values); 

      } 

      protected JSONObject doInBackground(JSONObject... params) { 


       JSONObject json2 = CollectComments.collectComments(usernameforcomments, offsetNumber); 


        return json2; 



      } 

      @Override 
      protected void onPostExecute(JSONObject json2) { 
       try { 
        if (json2.getString(KEY_SUCCESS) != null) { 
         registerErrorMsg.setText(""); 
         String res2 = json2.getString(KEY_SUCCESS); 
         if(Integer.parseInt(res2) == 1){ 



          JSONArray commentArray = json2.getJSONArray(KEY_COMMENT); 
          String test1[] = new String[commentArray.length()]; 
          for (int i=0; i<commentArray.length(); i++) { 
           comments[i] = commentArray.getString(i); 
          } 
          JSONArray numberArray = json2.getJSONArray(KEY_NUMBER); 
          String test2[] = new String[] numberArray.length()]; 
          for (int i=0; i<numberArray.length(); i++) { 
           numbers[i] = numberArray.getString(i); 
          } 
          JSONArray usernameArray = json2.getJSONArray(KEY_USERNAME); 
          String test3[] = new String[usernameArray.length()]; 
          for (int i=0; i<usernameArray.length(); i++) { 
           usernames[i] = usernameArray.getString(i); 
          } 


          ListView lstComments = (ListView)findViewById(android.R.id.list); 
          lstComments.setAdapter(mycmlist); 








          }//end if key is == 1 
         else{ 
          // Error in registration 
          registerErrorMsg.setText(json2.getString(KEY_ERROR_MSG)); 
         }//end else 
        }//end if 
       } //end try 

       catch (JSONException e) { 
        e.printStackTrace(); 
       }//end catch  
      } 
     } 


     new loadComments().execute(); 

Voici mon logcat

07-16 15:21:15.719: W/dalvikvm(19691): threadid=1: thread exiting with uncaught exception (group=0x40ac9228) 
07-16 15:21:15.739: E/AndroidRuntime(19691): FATAL EXCEPTION: main 
07-16 15:21:15.739: E/AndroidRuntime(19691): java.lang.NullPointerException 
07-16 15:21:15.739: E/AndroidRuntime(19691): at com.example.DashboardActivity$1CreateCommentLists.getCount(DashboardActivity.java:404) 
07-16 15:21:15.739: E/AndroidRuntime(19691): at android.widget.ListView.setAdapter(ListView.java:460) 
07-16 15:21:15.739: E/AndroidRuntime(19691): at com.example.DashboardActivity$1loadComments.onPostExecute(DashboardActivity.java:539) 
07-16 15:21:15.739: E/AndroidRuntime(19691): at com.example.DashboardActivity$1loadComments.onPostExecute(DashboardActivity.java:1) 
07-16 15:21:15.739: E/AndroidRuntime(19691): at android.os.AsyncTask.finish(AsyncTask.java:602) 
07-16 15:21:15.739: E/AndroidRuntime(19691): at android.os.AsyncTask.access$600(AsyncTask.java:156) 
07-16 15:21:15.739: E/AndroidRuntime(19691): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 
07-16 15:21:15.739: E/AndroidRuntime(19691): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-16 15:21:15.739: E/AndroidRuntime(19691): at android.os.Looper.loop(Looper.java:154) 
07-16 15:21:15.739: E/AndroidRuntime(19691): at android.app.ActivityThread.main(ActivityThread.java:4945) 
07-16 15:21:15.739: E/AndroidRuntime(19691): at java.lang.reflect.Method.invokeNative(Native Method) 
07-16 15:21:15.739: E/AndroidRuntime(19691): at java.lang.reflect.Method.invoke(Method.java:511) 
07-16 15:21:15.739: E/AndroidRuntime(19691): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
07-16 15:21:15.739: E/AndroidRuntime(19691): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
07-16 15:21:15.739: E/AndroidRuntime(19691): at dalvik.system.NativeStart.main(Native Method) 
+0

Pourquoi exactement avez-vous besoin AsyncTask être à l'intérieur de votre BaseAdapter? Il semble que vous pourriez avoir votre Async dans votre activité, obtenir ce dont vous avez besoin de votre adaptateur en utilisant des méthodes de getter ... et les passer dans votre Async –

+0

Je dis cela parce qu'il vous permettra de séparer les choses que vous devez faire en arrière-plan de votre adaptateur Laissez l'AsyncTask s'inquiéter de l'arrière-plan/json, et laissez votre thread principal onPostExecute/manipuler les résultats de cette logique –

+0

noo, l'async et baseadpater ne sont pas à l'intérieur de l'autre. L'async rassemble des chaînes et est supposé l'envoyer à Baseadapter. –

Répondre

0

Puisqu'ils sont les deux classes internes de la Activity alors vous devriez être en mesure de faire vos ListView et Adapter références variables membres vous pouvez appeler setAdapter() sur votre ListView ou notifyDataSetChanged() sur votre Adapter selon que vous le mettez à jour ou que vous le définissez initialement.

Si vous faites ce

ListView lstComments 

une variable membre des Activity puis classes internes sera en mesure de le voir. Ainsi, lorsque vous appelez

lstComments = (ListView)findViewById(android.R.id.list); 
    lstComments.setAdapter(mycmlist); 

dans votre AsyncTask il devrait mettre à jour votre liste

+0

Où placer l'notifyDataSetChanged()? –

+0

Si vous ne faites que télécharger la liste et l'ajouter à la 'Adapter', vous n'en avez pas besoin. C'est pour si vous mettez à jour une liste – codeMagic

+0

Parce que j'ai fait comme vous l'avez dit avec le ListView et les variables ne sont toujours pas envoyées à l'adaptateur correctement. –

Questions connexes