2014-11-22 4 views
0

내 응용 프로그램의 카테고리를 Parse 데이터베이스에서로드하려고합니다. EditText 뷰를 데이터베이스에서 다운로드 한 String ArrayList 값으로 설정하여 결과를 반환 할 수 있습니다. 그러나 doInBackground 메서드에서 ArrayList를 반환하고 onPostExecute 메서드의 결과에 동일한 EditText를 설정하려고하면 인덱스가 범위를 벗어나 ArrayList 크기가 0이라고 표시됩니다.이 코드는 내 코드입니다.AsyncTask onPostExecute doInBackground에서 결과를 반환하지 않습니다.

private class DownloadCategories extends AsyncTask<Void, Void, ArrayList<String>> { 
    protected ArrayList<String> doInBackground(Void... voi) { 
     final ArrayList<String> load = new ArrayList<String>(); 
     ParseQuery<ParseObject> query = ParseQuery.getQuery("Categories"); 
     query.findInBackground(new FindCallback<ParseObject>() { 
      @SuppressLint("NewApi") 
      public void done(List<ParseObject> objects, ParseException e) { 
       String category; 
       if (e == null) { 
        for (int i = 0; i < objects.size(); i++) { 
         ParseObject pObject = objects.get(i); 
         category = pObject.getString("name"); 
         load.add(category); 

        } 
        // onSucced(objects); 
       } else { 

       } 
       //This is where i successfully can set the EditText to the first index. 
       address.setText(load.get(0)); 
      } 
     }); 
     return load; 
    } 

    protected void onPostExecute(ArrayList<String> loadedCats) { 

     //This is where it gives me a null pointer error, since loadedCats is empty. 
     address.setText(loadedCats.get(0)); 

    } 

} 

클래스 변수를 사용하여 onPostExecute 메서드의 변수에 액세스하거나 범주를 다운로드 한 후 UI를 doInBackground 메서드에서 업데이트해야합니까? 아니면 결과에 대한 문제에 대한 해결책이 있습니까?

미리 감사드립니다.

+0

물론 null을 반환해야합니다. 백그라운드 스레드에서 백그라운드 스레드를 호출하고 있습니다! –

답변

1

부모가 필요하지 않습니다. AsyncTask, 이미 findInBackground을 사용하고 있습니다.

여기에 문제가 발생하는 이유는 findInBackground이 백그라운드에서 실행 중이므로 AsyncTaskdone 메서드가 호출 될 때까지 기다리지 않습니다. 대신 빈 ArrayList가 반환됩니다. 그 후 done 메서드가 호출되므로 목록에 아무런 차이가 없습니다.

관련 문제