2016-05-11 3 views
-1

Как говорит название, моя переменная не обновляется AsyncTaskonPostExecute()Переменная не обновляется AsyncTask

Вот код

public class Search extends AppCompatActivity { 

ArrayList<paire> Sectors = new ArrayList<paire>();//paire is my proper class 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_search); 
    Rechercher rech = new Rechercher(); 
    rech.execute(); 
    //PRINTING SIZE OF Sectors HERE TELLS ME EXACTLY THE SIZE OF 0 

    /* 
    * 
    * 
    BLA BLA BLA BLA 
    * 
    * 
    */ 
} 

public class Rechercher extends AsyncTask<String, Void, ArrayList<paire>>{ 

    @Override 
    protected ArrayList<paire>doInBackground(String... strings) { 
     /* 
     * 
     Process of creating the arrayList myArray 

     * 
     */ 
     onPostExecute(myArray);//I put this desesperatly xD it doesn't change anything 

     return myArray; 
    } 
    protected void onPostExecute(ArrayList<paire>myArray) { 
     for (int u = 0; u < myArray.size(); u ++){ 
       paire r = myArray.get(u); 
       Sectors.add(r); 
      } 
     //PRINTING SIZE OF Sectors HERE TELLS ME EXACTLY THE SIZE OF myArray 
    } 

} 
} 

Ну myArray создается из данных, полученных незаконным из базы данных (подключение HTTP, JSON результат ...), и результат является очень приемлемым выходом JSON; здесь нет проблем, просто Sectors не обновляется, если я пытаюсь использовать его на Main. Я не знаю, действительно ли я понимаю onPostExecute; или есть проблема! Спасибо

+0

Я думаю, вы смущены тем, что асинхронность выполняется асинхронно. Вы увидите, как это запланировано, если вы запустили свой код в режиме отладки и разместили точки останова в различных методах. – njzk2

ответ

0

Это здание без ошибок? Я не верю, что вы можете вызвать onPostExecute из doInBackground, и я не вижу нигде в коде, где есть переменная с именем «s», но s.size() - это то, что контролирует количество повторений цикла for. Поэтому в текущем коде Sector.set никогда не будет вызван.

+0

Ah; да, я обновил его; благодаря ! –

0

вы должны еще раз прочитать информацию о asyncTask. Изменить вам asynTask ниже

public class Rechercher extends AsyncTask<String, Void, ArrayList<paire>>{ 

@Override 
protected Void doInBackground(String... strings) { 
    /* 
    * 
    Process of creating the arrayList myArray 

    * 
    */ 
    /* don't need to call this function, asynctask will call it automatically 
     onPostExecute(myArray); 
    */ 
    return myArray; 
} 
protected void onPostExecute(ArrayList<paire>myArray) { 

    if (Selector.size() > 0) { 
     Selector.clear(); 
    } 
    for (int u = 0; u < s.size(); u ++){ 
     Sectors.add(s.get(u)); 
    } 
      //PRINTING SIZE OF Sectors HERE TELLS ME EXACTLY THE SIZE OF myArray 
} 
} 
+0

'code Ошибка: (164, 20) error: несовместимые типы: ArrayList не может быть преобразован в Void' Просто в строке возврата –

+0

Извините, я обновил свой ответ –

+0

Yah; а также 'codeprotected ArrayList doInBackground (String ... strings)', но размер после выполнения Rech всегда равен 0 :( –

1

onPostExcecute позвонит автоматически просто вернуть массив в doBackground и передать ArrayList вместо пустоты в AsyncTask<String, Void, ArrayList<paire>> и изменить тип возвращаемого doInBackground к ArrayList<paire>

попробовать это:

public class Rechercher extends AsyncTask<String, Void, ArrayList<paire>>{ 

     @Override 
     protected ArrayList<paire> doInBackground(String... strings) { 
      /* 
      * 
      Process of creating the arrayList myArray 

      * 
      */ 
      //onPostExecute(myArray); // remove this line no need to add . this will call automatically. 
      return myArray; 
     } 
     protected void onPostExecute(ArrayList<paire> myArray) { 
      for (int u = 0; u < s.size(); u ++){ 
       Sectors.set(u, s.get(u)); 
      } 
      //PRINTING SIZE OF Sectors HERE TELLS ME EXACTLY THE SIZE OF myArray 
     } 

    } 

надеюсь, что эта помощь.

+0

Спасибо за ответ; но он не работает T_T –

+0

вы обновляете свой фрагмент так же, как и мой, не так ли? – KDeogharkar

+0

Я сделал копию/прошлое! –

0
package caci.elmouchir; 

import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.math.BigInteger; 
import java.security.MessageDigest; 
import java.util.ArrayList; 

import android.util.Log; 
import android.widget.*; 
import android.widget.Spinner; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

public class Search extends AppCompatActivity { 

    private void setSectors(String[] lesSec){ 
     Spinner sec = (Spinner) findViewById(R.id.spinnerSecteur); 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_spinner_item, lesSec); 
     sec.setAdapter(adapter); 

     sec.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){ 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      } 
      public void onNothingSelected(AdapterView<?> parent) { 
      } 
     }); 
    } 
    ArrayList<paire> Sectors = new ArrayList<paire>(); 
    ArrayList<paire> Branchs = new ArrayList<paire>(); 
    ArrayList<paire> SBranchs = new ArrayList<paire>(); 
    ArrayList<paire> Activities = new ArrayList<paire>(); 





    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_search); 
     String Code = "X.XX.XX.XXX"; 
     Rechercher rech = new Rechercher(); 
     rech.execute(); 
     Log.e("log_tag", Integer.toString(Sectors.size())); 
     //Log.e("log_tag", Integer.toString(Sectors.size())); 






     Button search = (Button)findViewById(R.id.buttonSearch); 
     search.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       EditText motcle = (EditText)findViewById(R.id.editMotCle); 
       if (motcle.getText().toString().isEmpty()) 
        motcle.setError("Entrez un mot clé"); 
      } 
     }); 

     /* 
     * 
     * 
     * 
     * 
     C O N N E X I O N     A    L A    B A S E    D E     D O N N E E S 
     * 
     * 
     * 
     * 
     */ 


    } 


    public class Rechercher extends AsyncTask<String, Void, ArrayList<paire>>{ 

     @Override 
     protected ArrayList<paire> doInBackground(String... strings) { 
      String result = ""; 
      ArrayList<paire> s = new ArrayList<paire>(); 
      try{ 

       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost("http://192.168.1.145/test/getActivities.php"); 
       //httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       InputStream is = entity.getContent(); 
       //convert response to string 
       BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
       StringBuilder sb = new StringBuilder(); 
       String line = null; 
       while ((line = reader.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 
       is.close(); 

       result=sb.toString(); 
       //Log.e("log_tag", result); 
       try{ 

        JSONArray jArray = new JSONArray(result); 

        ArrayList<paire> b = new ArrayList<paire>(); 
        ArrayList<paire> sous = new ArrayList<paire>(); 
        ArrayList<paire> a = new ArrayList<paire>(); 

        for(int i=0;i<jArray.length();i++){ 
         JSONObject json_data = (JSONObject)jArray.getJSONObject(i); 
         if (json_data.getString("friendly_url").toString().length() == 2){ 
          paire p = new paire(json_data.getString("title").toString(),json_data.getString("friendly_url").toString()); 
          s.add(p); 


         } 
         else if(json_data.getString("friendly_url").toString().length() == 3){ 
          b.add(new paire(json_data.getString("title").toString(),json_data.getString("friendly_url").toString())); 
         } 
         else if(json_data.getString("friendly_url").toString().length() == 4){ 
          sous.add(new paire(json_data.getString("title").toString(),json_data.getString("friendly_url").toString())); 
         } 
         else{ 
          a.add(new paire(json_data.getString("title").toString(),json_data.getString("friendly_url").toString())); 
         }} 
        //Log.e("log_tag", Integer.toString(s.size())); 

        // onPostExecute(s, b, sous, a); 



       }catch(JSONException e){ 
        Log.e("log_tag", "Error parsing data "+e.toString()); 
       } 

      }catch(Exception e){ 
       Log.e("log_tag", "Error in http connection "+e.toString()); 
      } 


      return s; 
     } 
     protected void onPostExecute(ArrayList<paire>s) { 
      /*Sectors = s; 
      Branchs = b; 
      SBranchs = sous; 
      Activities = a;*/ 


       for (int u = 0; u < s.size(); u ++){ 
        paire r = s.get(u); 
        Sectors.add(r); 
       } 
      Log.e("log_tag", "loool: "+Integer.toString(Sectors.size())); 

     } 

    } 


    public class paire{ 
     String title; 
     String url; 
     paire(String p, String u){ 
      this.title = p; 
      this.url = u; 
     } 
     String getTitle(){ 
      return this.title; 
     } 
     String getUrl(){ 
      return this.url; 
     } 
    } 
} 
Смежные вопросы