2015-11-05 5 views
2

В чем разница, если я вызываю методы в пределах AsyncTask [1] vs если я пишу код непосредственно в нем [2]? Если я напишу весь свой код в пределах AsyncTask, то это действительно захламлено. Я хочу создать отдельные методы для этого или, возможно, даже для отдельных классов.Методы вызова внутри AsyncTask?

[1]:

public class MyAsyncTask extends AsyncTask < Void, Void, String > { 
    @Override 
    protected String doInBackground(Void...params) { 
    loadXML(); 
    } 
    @Override 
    protected void onPostExecute(String result) { 
    setValues(); 
    } 
} 

public void loadXML() { 
    //loadsXML 
} 
public void setValues() { 
    //Sets values to textViews 
} 

[2]:

public class MyAsyncTask extends AsyncTask < Void, Void, String > { 
    @Override 
    protected String doInBackground(Void...params) { 
    //Load XML from web 
    } 
    @Override 
    protected void onPostExecute(String result) { 
    //Set TextView from result obtained in doInBackground 
    } 
} 
+0

В этом нет ничего плохого. Есть ли у вас проблемы? – codeMagic

+0

Я не тестировал его, я просто хотел знать, можно ли использовать AsyncTask таким образом, прежде чем переместить мой беспорядок в методы. : D –

+2

Хорошо, у вас есть мое разрешение. Продолжайте ... – codeMagic

ответ

0

В этом нет ничего плохого, но имейте в виду, что методы все еще работают в потоке AsyncTask. Поэтому, если вы хотите изменить поток пользовательского интерфейса, например, вы все равно должны использовать publishProgress/onProgressUpdate (это означает, что вам понадобится ссылка на экземпляр AsyncTask).

+0

Итак, если я вызываю метод в: 'protected void onPostExecute (String result) {// здесь}', который будет setText для textView, это не сработает? –

+0

Нет, все будет хорошо. Я имел в виду во время исполнения. (Например, если вам нужно получить доступ к потоку пользовательского интерфейса из 'loadXML()') –

0

There's нет различию, так как код будет работать в том же потоке. Почувствуйте, как писать.

0

Нет разницы, но ...

С [1] подходить программа становится более модульным и следует принцип объектно-ориентированного.

С подходом [2] он становится более неуклюжим, если вы хотите включить в него еще несколько методов.

и третий подход [3], который я лично предпочитаю делать это, чтобы выставить метод loadXML() в отдельном классе говорит XMLLoader инкапсулировать сложности XML разбора и загрузки и использовать этот класс в AsyncTask для загрузки XML.

Аналогичным образом setValues() может быть выставлен в пределах моего вида активности в андроиде, который должен быть передан AsyncTask в качестве параметра.

Обратите внимание, что существуют другие способы решения этого модульным способом.

+0

Спасибо за ваш ответ! Я использовал отдельный класс и помещал в него свою AsyncTask. Затем я вызываю эту AsyncTask из моей MainAcitvity следующим образом: 'AnotherClass.MyAsyncTask.execute();'. Это дает мне ошибку, говоря, что нестатический метод не может ссылаться на статический контекст. –

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