0

У меня есть следующий псевдокод:Концепция относительно кодирования с большим количеством GUI обновлений в Android (Gui Обработчики)

MySteps(){ 
    //Step A 
    if (conditionA) { 
    showwaitdialog(messageA); // shows wait dialog, so User knows app is running 
    longrunnerA; // long running task, like downloading from internet. 
    dismissdialog // closes the wait dialog. 
    } 
    //Step B 
    if (conditionB && stepAfinished) { //real if not elseif 
    showwaitdialog(messageB); // shows wait dialog 
    longrunnerB; // long running task, like downloading from internet. 
    dismissdialog 
    } 
    //Step C 
    if (conditionC && stepDfinished) { //real if not elseif 
    showwaitdialog(messageC); // shows wait dialog 
    longrunnerC; // long running task, like downloading from internet. 
    dismissdialog 
    } 
    if (!conditionA && !conditionB && !conditionC && allStepsfinished){ 
    startStepD(); 
    } 
} 

Теперь мне нравится реализовать эту логику в моей Android App: С моим знанием я бы закодировать его следующим образом (также вид pseodocode), что приводит к очень уродливый код:

HandlerA(){ 
    dismissDialog(); 
    if(ConditionB){ 
    showwaitdialog(messageB); // shows wait dialog 
    new BackgroundTask { 
     longrunnerB; // long running task, like downloading from internet. 
     callHandlerB(); 
    } 
    } 
} 

HandlerB(){ 
    dismissDialog(); 
    if(ConditionC){ 
    showwaitdialog(messageC); // shows wait dialog 
    new BackgroundTask { 
     longrunnerC; // long running task, like downloading from internet. 
     callHandlerC(); 
    } 
    } 
} 

HandlerC(){ 
    dismissDialog(); 
    if(!ConditionA && !ConditionB && !ConditionC){ 
    new BackgroundTask { 
     startStepD(); 
    } 
    } 
} 


MySteps(){ // not correct name, because it calls only step A. I cant see,that there is a lot other stuff triggered. 
    showwaitdialog(messageA); // shows wait dialog 
    new BackgroundTask(){ 
    longrunnerA(); // long running task, like downloading from internet. 
    call HandlerA(); 
    } 
} 

Этот код распространяется в разных местах, а метод «MySteps» имеет неправильное название, потому что это только делает Степа.

Как я могу кодировать это более компактным и чистым, поэтому у меня будет метод MySteps(), который концентрирует всю логику, и обновления графического интерфейса будут работать правильно?

* UPDATE *

Кодирование с обработчиками аналогично кодированию с GOTO отчетности. Каждый кодер знает, нам следует избегать операторов GOTO. Вот почему я ищу лучшую концепцию кодирования для реализации вышеприведенной логики.

+0

Что означает 'longrunner' в Mysteps? (Метод?) –

+0

Это долго работающая задача. Не имеет значения, что она делает концептуальной. Это просто задача, которая длится долго. Например, загружает данные из Интернета. –

+0

В порядке, я думаю, что эта логика, похоже, обрабатывается с использованием AsyncTask. –

ответ

0

Решение

Я думаю, что этот псевдокод код может использовать AsyncTask.

Если ваша функция fun похожа на загрузку файла, то это, вероятно, лучший выбор.

ExampleTask

public class ExampleTask extends AsyncTask<URL, Void, Boolean> { 

    private ProgressDialog dialog; 
    private Context context; 
    private String message; 

    public ExampleTask(Context context, String message) 
    { 
     this.context = context; 
     this.dialog =new ProgressDialog(context); 
     this.message = message; 
    } 

    protected Boolean doInBackground(URL... urls) { 
     int count = urls.length; 
     showDialog(); 

     for (int i = 0; i < count; i++) { 

      // implement download target url[i] 
      if (isCancelled()) return false; 
     } 

     dismissDialog(); 
     return true; 
    } 

    private void showDialog() 
    { 
     // show dialog 
    } 

    private void dismissDialog() 
    { 
     // dissmiss dialog 
    } 

    @Override 
    protected void onPostExecute(Boolean aBoolean) { 
     super.onPostExecute(aBoolean); 

     //implements result handling 
    } 
} 

ExecuteTask

new ExampleTask(this, "message").execute(url1, url2, url3);