布尔人从Android中的Asynctask返回



我想以异步返回布尔值。

这是异步(不是整个代码,因为并不重要,sstackoverflow给我错误(

public class CallSoap extends AsyncTask<CallSoapParams, Void, Void> {
public interface AsyncResponse {
    void processFinish(String output);
}
private Context activityContext;
public AsyncResponse delegate = null;//Call back interface
public CallSoap(Context context, AsyncResponse asyncResponse) {
    activityContext = context;
    delegate = asyncResponse;
}
@Override
protected Void doInBackground(CallSoapParams... params) {
    request = new SoapObject(params[0].NAMESPACE, params[0].METHOD_NAME);
    // no important things
    return null;
}
@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
    //dismiss ProgressDialog
    delegate.processFinish(response.toString());
}
@Override
protected void onPreExecute() {
    super.onPreExecute();
    //create and show ProgressDialog
}
}

这是活动的实现(不是整个代码,因为不重要,而sstackoverflow给我错误(:

    private boolean checkDataRegistrationByServer() {
    if (NickNameExist()) {
        // DO STUFF
    }
    return true;
}
Boolean r;
private boolean NickNameExist() {
    CallSoapParams callParams = new CallSoapParams(NICKNAME_EXIST);
    CallSoap NickNameExistCall = new CallSoap(RegistrationActivity.this, new CallSoap.AsyncResponse() {
        @Override
        public void processFinish(String output) {
            Log.d("Response From AsyTask:", output);
            if (output.equals(FALSE_RESPONSE)) {
                r = false;
                Toast.makeText(getApplicationContext(), output + " - NickNameExistCall - Nick don't exist", Toast.LENGTH_SHORT).show();
            } else {
                r = true;
            }
        }
    });
    NickNameExistCall.execute(callParams);
    return r;
}

我试图创建一个全局布尔值,但应用程序崩溃。有人可以帮助我吗?

1(您在任何地方都没有response变量,而doInBackground已返回null而不是任何响应,因此不清楚如何获得该值。

 delegate.processFinish(response.toString());

2(您无法从该功能返回。并且您的应用程序崩溃可能是因为Boolean的s可能为null。boolean不能。但是,您不应该尝试在此处进行全局变量,因为这不是异步代码运行的方式。

您需要的是通过函数传递回调

private void checkDataRegistrationByServer(String data, CallSoap.AsyncResponse callback) { 
    CallSoap nickNameExistCall = new CallSoap(RegistrationActivity.this, callback);
    CallSoapParams callParams = new CallSoapParams(data);
    nickNameExistCall.execute(callParams);
}

其他地方...

final String nick = NICKNAME_EXIST;
checkDataRegistrationByServer(nick, new CallSoap.AsyncResponse() {
    @Override
    public void processFinish(String response) {
        Log.d("Response From AsyncTask:", output);
        boolean exists = !response.equals(FALSE_RESPONSE);
        if (!exists) {
            Toast.makeText(getApplicationContext(), output + " - NickNameExistCall - Nick " + nick + " doesn't exist", Toast.LENGTH_SHORT).show();
        }
    }
});

注意:如果您使异步性返回异步中的布尔值,则可以将此代码缩短一些。

最新更新