Асинхронный вызов функциии в Андроиде

Рейтинг: 0Ответов: 1Опубликовано: 26.04.2015

Был вот такой чудесный код: Нативная работа с интерфейсом Android . Добавил асинхронность, получилось:

    void OnLoginLayout(){
    setContentView(R.layout.login);

    Button auth = (Button) findViewById(R.id.LoginLayout_Auth);
    auth.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v){
        EditText login = (EditText) findViewById(R.id.LoginLayout_Login);
        EditText pass = (EditText) findViewById(R.id.LoginLayout_Password);

        LoginAsync mt = new LoginAsync(login.getText().toString(), pass.getText().toString()); mt.execute();

        //if(Login(login.getText().toString(), pass.getText().toString())!=0)
        //  OnMainLayout();
        //else{
        //  String err=GetLoginError();
        //  TextView error = (TextView) findViewById(R.id.LoginLayout_Error);
        //  error.setText(err);
        //}
     }
     });

    auth = (Button) findViewById(R.id.LoginLayout_Reg);
    auth.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v){
        OnRegisterLayout();
    }
    });

    return;
}

class LoginAsync extends AsyncTask<Void, Void, Void>{
    String login, pass;
    int login_result;

    public LoginAsync(String l, String p){
        login=l;
        pass=p;
    }

    @Override
    protected void onPreExecute(){
      super.onPreExecute();
        TextView error = (TextView) findViewById(R.id.LoginLayout_Error);
        error.setText("Login...");
    }

    @Override
    protected Void doInBackground(Void... params){
        login_result=Login(login, pass);
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
      super.onPostExecute(result);

      if(login_result!=0)
            OnMainLayout();
        else{
            String err=GetLoginError();
            TextView error = (TextView) findViewById(R.id.LoginLayout_Error);
            error.setText(err);
        }
    }
  }

Выглядит довольно переусложненным. Как можно оптимизировать этот код?

Для меня оптимальным решением видится:

            LoginAsync mt = new LoginAsync();
        int result;

        mt.setPre(new Pre{
            TextView error = (TextView) findViewById(R.id.LoginLayout_Error);
            error.setText("Login...");
        });

        mt.setAsync(new Async{
            result=Login(login.getText().toString(), pass.getText().toString());
        });

        mt.setAsync(new Post{
            if(result)
                OnMainLayout();
            else{
                String err=GetLoginError();
                TextView error = (TextView) findViewById(R.id.LoginLayout_Error);
                error.setText(err);
            }
        });

        mt.execute();

Подскажите, как это реализовать.

Так же вопрос: как вызывать код логина в одном экземпляре?

Ответы

▲ 1

Получилось:

    int OnLoginLayoutRun = 0;

void OnLoginLayout(){
    setContentView(R.layout.login);

    Button auth = (Button) findViewById(R.id.LoginLayout_Auth);
    auth.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v){
        EditText login = (EditText) findViewById(R.id.LoginLayout_Login);
        EditText pass = (EditText) findViewById(R.id.LoginLayout_Password);

        //LoginAsync mt = new LoginAsync(login.getText().toString(), pass.getText().toString()); mt.execute();

        //if(Login(login.getText().toString(), pass.getText().toString())!=0)
        //  OnMainLayout();
        //else{
        //  String err=GetLoginError();
        //  TextView error = (TextView) findViewById(R.id.LoginLayout_Error);
        //  error.setText(err);
        //}

        if(OnLoginLayoutRun!=0)
            return;

        OnLoginLayoutRun=1;

        AutoAsync mt = new AutoAsync();
        final int result[] = new int[1];
        //final String str[] = new String(login.getText().toString(), pass.getText().toString());
        final String slogin=login.getText().toString();
        final String spass=pass.getText().toString();

        mt.setPre(new AutoAsyncFunc(){ @Override public void execute(){
            TextView error = (TextView) findViewById(R.id.LoginLayout_Error);
            error.setText("Login...");
            }
        });

        mt.setBg(new AutoAsyncFunc(){ @Override public void execute(){
            result[0]=Login(slogin, spass);
            }
        });

        mt.setPost(new AutoAsyncFunc(){ @Override public void execute(){
            if(result[0]!=0)
                OnMainLayout();
            else{
                String err=GetLoginError();
                TextView error = (TextView) findViewById(R.id.LoginLayout_Error);
                error.setText(err);
            }
            OnLoginLayoutRun=0;
            }
        });

        mt.execute();

     }
     });

    auth = (Button) findViewById(R.id.LoginLayout_Reg);
    auth.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v){
        OnRegisterLayout();
    }
    });

    return;
}


class AutoAsyncFunc{
    public void execute(){
      return ;
    }
}

class AutoAsync extends AsyncTask<Void, Void, Void>{
    AutoAsyncFunc pre, bg, post;

    public AutoAsync(){}

    public void setPre(AutoAsyncFunc func){
        pre=func;
    }

    public void setBg(AutoAsyncFunc func){
        bg=func;
    }

    public void setPost(AutoAsyncFunc func){
        post=func;
    }

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

    @Override
    protected Void doInBackground(Void... params){
        bg.execute();
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
      super.onPostExecute(result);
      post.execute();
  }
}