2016-07-13 3 views
0

У меня есть класс, называемый "DataBase" расширяет "AsyncTask" для использования удаленной базы данныхвеб-службы в Android с помощью 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); 


} 
} 

Когда я запускаю свой проект в строка кода "dataBase.Execute();" в классе «MainActivity», не выполняет блок кода «doInBackground» немедленно, но запускается после завершения выполнения всех строк кода, которые находятся в «MainActivity», и по этой причине в строке кода «myArray = dataBase.getArrayList();» он возвращает null.

Я хочу знать, как сделать «dataBase.Execute();» запускать немедленно и не продолжать с другими строками кода «MainActivity», пока он не запустит «doInBackground», а затем строку кода «myArray = dataBase.getArrayList();» no return null

ответ

1

Это будет не работает, поскольку это блокирует ваш основной поток. Вам нужно, чтобы ваш Activity отвечал на асинхронные события. В этом и заключается вся причина использования AsyncTask или вручную Thread. Сетевые операции: блокировка операций, которые могут занять много времени (например, медленная сеть). Если вы заблокируете свой основной поток, система объявит ANR в вашем процессе и убьет его.

Вот статья на AsyncTask, который поможет объяснить, как это работает: http://po.st/Cei3m2

0

Проблема в том, что ваш код работает в фоновом потоке, и вы должны добавить эту строку myArray = dataBase.getArrayList(); внутри doInBackground базы данных.

Я изменил код, добавив это правильный путь

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; 
    } 
} 
Смежные вопросы