让主线程等待backgroundtasks完成?

时间:2014-05-23 19:40:48

标签: android multithreading

在我的应用中,我希望用户能够注册自己。如果他们之前的另一个用户已经使用了该特定的电子邮件地址或用户名,则该应用应该这样说,而不是让他们将数据上传到服务器。

现在我的问题是,主线程不等待检查用户名或电子邮件是否已存在的两个后台任务,而是继续运行,以便将每个用户对象发送到服务器,即使它们已经存在。

以下是检查用户名和电子邮件的代码:

    public void checkEmailadress(String s){

        ParseQuery<ParseObject> query = ParseQuery.getQuery("userLogin");
        query.whereEqualTo("emailadress",s);
        query.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> arg0, ParseException e) {
            // TODO Auto-generated method stub
            Iterator itr = arg0.iterator();
            if(itr.hasNext()){
                emailadressInUse = true;
            }else{
                emailadressInUse = false;
            }
System.out.println(emailadressInUse);
    finishSubmittingUser();
        }
        });


    }

同样可以检查用户名。这很好用。问题是,boolean emailadressInUse的更改速度不足以让主线程更改动作。

这是启动这两种方法的方法

public void submitNewUser(View view){
    EditText edittext1 = (EditText) findViewById(R.id.chose_username);
    EditText edittext2 = (EditText) findViewById(R.id.chose_realname);
    EditText edittext3 = (EditText) findViewById(R.id.chose_emailadress);
    EditText edittext4 = (EditText) findViewById(R.id.chose_password);

    username = edittext1.getText().toString();
    realname = edittext2.getText().toString();
    emailadress = edittext3.getText().toString();
    password = edittext4.getText().toString();

    checkUsername(username);
    checkEmailadress(emailadress);



    }

这是从checkEmail内部调用的。这两个布尔人现在应该改变了状态。根据checkEmail中的System.out.println,他们做到了。那么为什么我的方法finishSubmittingUser没有接受这个改变呢?

public void finishSubmittingUser(){
        if((usernameInUse==false) && (emailadressInUse==false)){
            saveDataChange("realname", realname);

            ParseObject userLogin = new ParseObject("userLogin");
            userLogin.put("username", username);
            userLogin.put("emailadress", emailadress);
            userLogin.put("password", password);
            userLogin.saveInBackground();

            Intent intent = new Intent(this, LogInUserActivity.class);
            intent.putExtra(USERNAME, username);
            startActivity(intent);
        }
        else{
            if(usernameInUse==true){
                Toast.makeText(getApplicationContext(),getString(R.string.username_in_use),Toast.LENGTH_SHORT).show();  
            }
            if(emailadressInUse==true){
                        Toast.makeText(getApplicationContext(),getString(R.string.emailadress_in_use),Toast.LENGTH_SHORT).show();   
            }
        }

    }

必须有一个简单的方法来做到这一点,我现在没有看到。

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

  

让主线程等待backgroundtasks完成?

正如Emmanuel所说,不要阻止主应用程序线程。

  

现在我的问题是,主线程不等待检查用户名或电子邮件是否已存在的两个后台任务,而是继续运行,以便将每个用户对象发送到服务器,即使它们已经存在。

如果&#34;每个用户对象都被发送到服务器&#34;用户所做的事情,在注册后,只需禁用该UI(例如,禁用操作栏项),直到您的注册确认为止。

如果&#34;每个用户对象都被发送到服务器&#34;是成功注册后自动发生的事情,那么在注册成功之前,您不应该执行该代码