2012-01-26 2 views
5

AsyncTask을 완료 한 후 List의 결과가 6 가지가 있습니다. 그리고 List 결과는 Activity으로 반환해야합니다. 예 : List<A>, List<B>, List<C>, List<D>, List<E> 및 마지막으로 List<F>.안드로이드에서 비동기 List 또는 ArrayList를 AsyncTask에 반환하는 방법

이것은 내 AsyncTask :

public class myAsync extends AsyncTask<String, String, List> { 

    private List resultList; 

    @Override 
    protected List doInBackground(String... params) { 
     //params[0] is url 
     //params[1] is type 
     callAPI api = new callAPI(params[0], params[1]); 
     // According to type api decides type of List and generates 
     return api.getJSON(); // returns a List which already parse JSON 
    } 

    @Override 
    protected void onPostExecute(List result) { 
     // Result is here now, may be 6 different List type. 
     this.resultList = result 
    } 

    // returns result 
    public List getResultList() { return this.resultList; } 
} 

이 같은 AsyncTask를 전화 할게 :

myAsync task = new myAsync(); 
task.execute(params); 
List myList = task.getResultList(); // type is uncertain 
Log.d("Tag", Integer.toString(myList.size()); 

알다시피, 나는 <> 태그 사이에 반환 형식 (결과)를 지적해야합니다. List에 대한 특정 유형을 선택하면 다른 유형에 대해서는 작동하지 않습니다.

사실, 이미 List<Object>List 유형 만 반환하려고 시도했습니다. 그러나 효과가 없습니다.

사용하고 싶지 않습니다. 6 가지가 다릅니다. Async입니다. 이 문제는 AsyncTask으로 해결할 수 있습니까? 나는 익명의 목록이나 모르는 것을 모른다고 생각한다. 아무도 이것을 설명 할 수 있습니까?

+0

당신은 무시할 수 <>, 그것은 오류가되지 않습니다, 그것은 단지 경고합니다. – kosa

+0

당신은이 정의를 사용해야 함을 의미합니다 :'AsyncTask '. 그렇다면 반환 유형은 무엇입니까? 이미 정상적인 List로 모든 유형을 반환했으며 NullException 오류가 발생했습니다. –

+0

여기에 stacktrace를 게시하면 다른 곳에서 가져온 NullPointer가 의심 스럽습니다. – kosa

답변

9

먼저 목록을 얻는 순서는 이 아니며이 맞지 않습니다. 나에게 보여 보자

// Initialize myAsync 
myAsync task = new myAsync(); 

// This will do work for some period of time, this statement DOES NOT 'block' 
// till myAsync completes, it will run it in the background 
task.execute(params); 

// This will return null because by the time you get here, task.execute most 
// likely hasn't finished yet. 
task.getResultList(); 

편집 : 그래서

@Override 
protected void onPostExecute(List result) { 
    Log.d(TAG, "The returned list contains " +result.size()+ "elements"); 
    // Do anything else you need to with the returned list here 
} 

: 지금 당신이 목록 결과와 함께 할 원하는 것을 포함으니, 여기에 당신이 당신의 onPostExecute 방법을 수정하는 것이 방법 요약하면 반환 된 목록 (크기 인쇄 외에) (예 : 비교, 인쇄 항목 등)을 수행해야하는 경우 onPostExecute 메서드에서 수행해야합니다.

+0

구문 오류입니다. 물론 task.getResultList() 여야합니다. 지금 수정되었습니다. 그리고 당신 말이 맞습니다. getResultList() 메소드의 초기 단계입니다. 내가 어떻게 부를 수 있니? –

+1

@OgulcanOrhan 이전 질문 (http://stackoverflow.com/a/9019395/1101070)에서 지적했듯이, 일반적으로 AsyncTask의 onPostExecute 메서드를 사용하여 필요한 모든 작업을 수행 할 수 있습니다 목록으로 할 일. 질문을 편집하여'task.getResultList()'로 _do_를 포함하면보다 나은 답변을 얻을 수 있습니다. –

+0

'doInBackground'와'onPostExecute'가 업데이트되었습니다. 나는 그것이 지금 분명하기를 바란다. –

2

목록의 내용 (A, B, C 등)에 따라 인터페이스를 만들 수 있습니다.

그래서 A, B, C 등이 객체 인 경우 ListContentInterface라고하는 인터페이스를 만들 수 있습니다. 그런 다음 각 요소는 ListContentInterface를 구현해야합니다.

if(element.getClass() == ClassToTestFor.class) ... 
: 당신이 다음 목록의 첫 번째 요소를 복용하고 그것을 확인하여 정말되는 목록의 내용이, 클래스 무엇을 테스트 할 수 있습니다 그 후

List<ListContentInterface>. 

: 당신은 다음과 같은 유형을 지적 할 수

개체에 공통된 방법이있는 경우 인터페이스에 개체를 지정해야합니다. 모든 메소드가 공통적 인 경우, 오브젝트의 클래스를 테스트하지 않고 직접 List List를 사용할 수 있습니다 (인터페이스가 정의한대로 모두 수행 할 수 있으므로).

나는 이것이 당신에게 어떤 의미가되기를 바랍니다. 그것은 인터페이스 또는 최상의 솔루션을 사용하지 않을 수도 있지만 귀하의 문제를 해결할 수 있습니다.

+0

예 이러한 6 개의 다른 개체에 대한 인터페이스를 만들 수 있습니다. 그러나 무엇이 바뀔 것인가? 나는 다음 단계를 이해할 수 없었다. –

+2

인터페이스에 모든 항목이 있으면 해당 인터페이스를 구현하는 개체가 포함 된 목록을 만들 수 있습니다. 그렇게하면 모든 객체에 대해 동일한 유형의 목록을 사용할 수 있습니다. 그 후에 다른 항목 유형에 특정한 작업을 수행해야하는 경우 항목 별 논리를 수행하기 전에 요소를 목록에서 꺼내 클래스를 테스트하면됩니다. –

0

나는 execute(). get();을 사용하여 이런 종류의 문제를 해결하고있다.

예하는

call from activity 

    ArrayList<String> arraylistitem= new jsonparsing(getActivity()).execute().get(); 

    In async task 

    public class jsonparsing extends AsyncTask<Void, Void, ArrayList<String>> 
    { 
    public jsonparsing(Activity activity) 
     { 
      this.activity = activity; 
      arraylistitem = new ArrayList<String>();   
     } 

     protected ArrayList<String> doInBackground(Void... arg0) 
     { 
       // Do anything else you need to with the returned list here 
      return arraylistitem; 
      } 
    } 
관련 문제