2013-07-11 3 views
5

Как вернуть список, сгенерированный в AsyncTask, в Activity?AsyncTask return List to Activity

Мой LoadStringsAsync класс:

public class LoadStringsAsync extends AsyncTask<Void, Void, List<String> > { 

    List<String> str; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     ... 
    } 

    @Override 
    protected List<String> doInBackground(Void... arg0) { 
     ... 
     get content from the internet 
     and 
     fill the list 
     ... 
    } 

    @Override 
    protected void onPostExecute(List<String> str) { 
     super.onPostExecute(events); 
     ... 

    } 
} 

и мне нужен список назад в моей деятельности, чтобы работать с ним. (Нет, чтобы не показывать это в ListView: P)

Любые предложения, как это сделать? :-)

Спасибо!

+0

http://stackoverflow.com/questions/17398837/processdialog-is-not-appearing-properly. проверьте это, в этом случае вы вернете строку. соответственно измените – Raghunandan

+0

Возможно, это зависит от того, что вы хотите сделать со списком. Можете ли вы предоставить нам больше информации? – Enrichman

ответ

7

ваш активность:

public class YourActivity extends Activity { 
    private List<String> list = new ArrayList<String>(); 

    public void onCreate(Bundle state) { 
     //... 
    } 

    public void setList(List<String> list) { 
     this.list = list; 
    } 

    private void fireYourAsyncTask() { 
     new LoadStringsAsync(this).execute(); 
    } 

}  

AsyncTask:

public class LoadStringsAsync extends AsyncTask<Void, Void, List<String>> { 

    List<String> str; 
    private YourAcitivity activity; 

    public LoadStringsAsync(YourAcitivity activity) { 
     this.activity = activity; 
    } 

    @Override 
    protected List<String> doInBackground(Void... arg0) { 
    } 

    @Override 
    protected void onPostExecute(List<String> str) { 
     super.onPostExecute(events); 
     activity.setList(str); 
    } 
} 
+0

Работает отлично! ...... не понял эту идею: D :) – Heisnberg

+0

не смог разрешить символьные события –

+0

Переменная событий находится в вопросе оп. Используйте свою собственную переменную. – wtsang02

0

Код места, который использует список, или задает его переменной, внутри onPostExecute().

Лучше запустить задачу из родительской деятельности, как:

public class MyActivity extends Activity{ 
    private List<String> mData = new ArrayList<String>(); 


    private void runTask(){ 
    new LoadStringsAsync(){ 

     @Override 
     protected void onPostExecute(List<String> str) { 
     super.onPostExecute(events); 
     mData.clear(); 
     mData.addAll(str); 
     } 

    }.execute(); 
    } 
} 
1

Если вы сделаете свой AsyncTask внутреннего класса в вашей деятельности, то onPostExecute будет находиться в том же контексте, что и активность, и вы можете использовать список как и вы в любом месте Activity.

Если вы не делаете свой AsyncTask внутренним классом в своей деятельности, вам необходимо настроить прослушиватель, чтобы вернуться к своей деятельности, когда заканчивается AsyncTask. Если вы предпочитаете ехать по этому маршруту, посмотрите на this post.

Существует также this post, который похож на ваш вопрос.

+4

Не называемый подкласс. Должна быть формулировка. «Внедрите AsyncTask в качестве внутреннего класса в вашей деятельности». – wtsang02

+0

Вы правы, я изменил его. – yiati

0

В соответствии с документацией от android link вы можете использовать метод get для возврата результатов вычислений. Так как ваш AsyncTask показывает, что вы возвращаете список, то вы можете попробовать следующий код в классе вы вызываете асинхронный класс

List<String> returnedlist=new LoadStringAsync().execute().get(); 

Надеясь эта опция помогает.

Смежные вопросы