方法调用之间的Android延迟

时间:2015-03-06 23:25:18

标签: java android

我有一个应用程序,它获取数据库上user_id的计数,以检查用户是否存在。

我遇到问题的代码:

registerBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        usernameR = usernameRgt.getText().toString();
        emailR = emailRgt.getText().toString();
        passwordR = passwordRgt.getText().toString();
        repeatR = repeatPassRgt.getText().toString();
        new userExistsTask().execute(new ApiConnector());
        if ((usernameR == null || usernameR.isEmpty() == true) || (emailR == null || emailR.isEmpty() == true) || (passwordR == null || passwordR.isEmpty() == true) || (repeatR == null || repeatR.isEmpty() == true)) {
            Toast.makeText(RegisterActivity.this, "One or more fields are empty!", Toast.LENGTH_SHORT).show();
        } else {
            if (userExistN == 0) {
                Toast.makeText(RegisterActivity.this, "Não existe", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(RegisterActivity.this, "existe", Toast.LENGTH_SHORT).show();
            }
        }
    }
});

它的工作方式我想问题的是调用new userExistsTask().execute(new ApiConnector());(设置变量userExistsN值的方法)需要一些时间来执行,而if得到错误的值变量userExistsN所以有一种方法可以在if和方法调用之间设置延迟吗?

更新

userExistYask()代码:

private class userExistsTask extends AsyncTask<ApiConnector,Long,JSONArray>
{
    @Override
    protected JSONArray doInBackground(ApiConnector... params) {

        // it is executed on Background thread

        return params[0].userExists(usernameR);
    }

    @Override
    protected void onPostExecute(JSONArray jsonArray) {

        if (jsonArray != null) {
            JSONObject json = null;
            try {
                json = jsonArray.getJSONObject(0);
                userExistN = json.getInt("userCount");
                System.out.println(userExistN);

            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            Toast.makeText(RegisterActivity.this, "Null", Toast.LENGTH_SHORT).show();
        }


    }
}

4 个答案:

答案 0 :(得分:3)

为什么不将IF代码放在单独的方法中并从postExecute调用此方法?这保证了在背景方法完成之前不会被调用的方法

答案 1 :(得分:1)

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {

  }
}, 5000);

答案 2 :(得分:1)

这里有几个问题。即使文本字段为空,您也在调用AsyncTask,这是不需要的。

要解决您的主要问题,只需将需要AsyncTask结果的功能移至onPostExecute()。

这样的事情:

    registerBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        usernameR = usernameRgt.getText().toString();
        emailR = emailRgt.getText().toString();
        passwordR = passwordRgt.getText().toString();
        repeatR = repeatPassRgt.getText().toString();
        if ((usernameR == null || usernameR.isEmpty() == true) || (emailR == null || emailR.isEmpty() == true) || (passwordR == null || passwordR.isEmpty() == true) || (repeatR == null || repeatR.isEmpty() == true)) {
            Toast.makeText(RegisterActivity.this, "One or more fields are empty!", Toast.LENGTH_SHORT).show();
        } else {
           new userExistsTask().execute(new ApiConnector());

        }
    }
});

然后你的AsyncTask:

private class userExistsTask extends AsyncTask<ApiConnector,Long,JSONArray>
{
    @Override
    protected JSONArray doInBackground(ApiConnector... params) {

        // it is executed on Background thread

        return params[0].userExists(usernameR);
    }

    @Override
    protected void onPostExecute(JSONArray jsonArray) {

        if (jsonArray != null) {
            JSONObject json = null;
            try {
                json = jsonArray.getJSONObject(0);
                userExistN = json.getInt("userCount");

                //change this to Lod.d(Tag, userExistN);
                System.out.println(userExistN);

                if (userExistN == 0) {
                    Toast.makeText(getApplicationContext(), "Não existe", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), "existe", Toast.LENGTH_SHORT).show();
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            Toast.makeText(RegisterActivity.this, "Null", Toast.LENGTH_SHORT).show();
        }


    }
}

答案 3 :(得分:0)

创建界面

public interface AsyncResponse {
    void processFinish(int userExistN);
}

在userExistsTask类中:

private class userExistsTask extends AsyncTask<ApiConnector,Long,JSONArray>
{
    public AsyncResponse delegate=null;
    @Override
    protected JSONArray doInBackground(ApiConnector... params) {
        return params[0].userExists(usernameR);
    }
    :
    :
    :
}
@Override
protected void onPostExecute(JSONArray jsonArray) {
    delegate.processFinish(userExistN);
}

在活动onCreate()

    userExistsTask existsTask = new userExistsTask();
    existsTask.execute(new ApiConnector());
    existsTask.delegate = this;

    void processFinish(int userExistN){
       if ((usernameR == null || usernameR.isEmpty() == true) || (emailR == null || emailR.isEmpty() == true) || (passwordR == null || passwordR.isEmpty() == true) || (repeatR == null || repeatR.isEmpty() == true)) {
           Toast.makeText(RegisterActivity.this, "One or more fields are empty!", Toast.LENGTH_SHORT).show();
       } else {
           if (userExistN == 0) {
               Toast.makeText(RegisterActivity.this, "Não existe", Toast.LENGTH_SHORT).show();
           } else {
               Toast.makeText(RegisterActivity.this, "existe", Toast.LENGTH_SHORT).show();
           }
       }
    }