2016-07-13 2 views
0

J'ai une classe appelée "DataBase" étend "AsyncTask" pour l'utilisation de base de données distanteservice Web dans Android en utilisant AsyncTask

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

ArrayList<String> arrayList = new ArrayList<>(); 
String nameJson; 

public DataBase(String nameJson) { 
    this.nameJson = nameJson;   
} 

protected String doInBackground(String... params) { 

    String jsonPhp = params[1]; 

     try { 
      String line = null; 
      URL url = new URL(jsonPhp); 
      HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); 

      InputStream inputStream = new BufferedInputStream(httpURLConnection.getInputStream()); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
      StringBuffer stringBuffer = new StringBuffer(); 

      if(bufferedReader != null){ 
       while((line = bufferedReader.readLine()) != null){ 
        stringBuffer.append(line+" 'n"); 
       } 
      }else{ 
       return null; 
      } 

      return stringBuffer.toString(); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    return null; 
} 

protected void onPostExecute(String s) { 
    arrayData(s); 
} 

public void arrayData(String buffer){ 
    try { 
     JSONArray jsonArray = new JSONArray(buffer); 
     JSONObject jsonObject = null; 
     arrayList.clear(); 

     for(int i=0;i<jsonArray.length();i++){ 
      jsonObject = jsonArray.getJSONObject(i); 
      String dataList = jsonObject.getString(nameJson.toString()); 
      arrayList.add(dataList); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

public ArrayList<String> getArrayList() { 
    return arrayList; 
    } 

} 

MainActivity

public class MainActivity { 

String adress = "http//....../.php"; //Here is the address of the file containing the json 
ListView listView; 
ArrayAdapter myArray; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    setContentView(R.layout.activity_main); 

    listView = (ListView) findViewById(R.id.my_list); 
    final DataBase dataBase = new DataBase("names"); 
    dataBase.execute(address); //This line of code is executed as if it were the last line of code, as if it were placed under the setAdapter.  
    myArray = dataBase.getArrayList(); // and for that reason this line return null 

    ArrayAdapter arrayAdapter; 
    arrayAdapter = new ArrayAdapter<String>(context,android.R.layout.simple_expandable_list_item_1,myArray); 
    listView.setAdapter(arrayAdapter); 


} 
} 

Quand je lance mon projet la ligne de code "dataBase.Execute();" dans la classe "MainActivity", n'exécute pas immédiatement le bloc de code "doInBackground", mais s'exécute après avoir fini d'exécuter toutes les lignes de code qui sont dans "MainActivity", et pour cette raison dans la ligne de code "myArray = dataBase.getArrayList(); " il renvoie null.

Je veux savoir comment faire le "dataBase.Execute();" Exécuter immédiatement et ne pas continuer avec les autres lignes du code "MainActivity", jusqu'à ce qu'il exécute "doInBackground", puis la ligne de code "myArray = dataBase.getArrayList();" pas de retour nul

Répondre

1

Ce sera ne fonctionne pas car cela bloquerait votre thread principal. Vous devez faire en sorte que votre Activity réponde aux événements asynchrones. C'est la raison complète pour utiliser un AsyncTask ou manuellement géré Thread. Les opérations réseau bloquent opérations qui peuvent prendre beaucoup de temps (par exemple réseau lent.) Si vous bloquez sur votre thread principal, le système va déclarer ANR sur votre processus et le tuer.

Voici un article sur AsyncTask qui contribuera à expliquer comment cela fonctionne: http://po.st/Cei3m2

0

Le problème est que votre code fonctionne dans un thread d'arrière-plan, et vous devez ajouter cette ligne myArray = dataBase.getArrayList(); à l'intérieur du doInBackground de DataBase.

Je modifié votre code d'ajouter la bonne façon

public class DataBase extends AsyncTask{ 
    ArrayList<String> arrayList = new ArrayList<>(); 
    String nameJson; 

    public DataBase(String nameJson) { 
     this.nameJson = nameJson; 
    } 

    protected String doInBackground(String... params) { 

     String jsonPhp = params[1]; 

     try { 
      String line = null; 
      URL url = new URL(jsonPhp); 
      HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); 

      InputStream inputStream = new BufferedInputStream(httpURLConnection.getInputStream()); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
      StringBuffer stringBuffer = new StringBuffer(); 

      if(bufferedReader != null){ 
       while((line = bufferedReader.readLine()) != null){ 
        stringBuffer.append(line+" 'n"); 
       } 
      }else{ 
       return null; 
      } 

      return stringBuffer.toString(); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    protected void onPostExecute(String s) { 
     arrayData(s); 

     // you have to add the code after get the data because this task runs in another trhead 
     //now it will not be null 
     ArrayAdapter arrayAdapter; 
     arrayAdapter = new ArrayAdapter<String>(context,android.R.layout.simple_expandable_list_item_1,myArray); 
     listView.setAdapter(arrayAdapter); 
    } 

    public void arrayData(String buffer){ 
     try { 
      JSONArray jsonArray = new JSONArray(buffer); 
      JSONObject jsonObject = null; 
      arrayList.clear(); 

      for(int i=0;i<jsonArray.length();i++){ 
       jsonObject = jsonArray.getJSONObject(i); 
       String dataList = jsonObject.getString(nameJson.toString()); 
       arrayList.add(dataList); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    public ArrayList<String> getArrayList() { 
     return arrayList; 
    } 
}