在Android中取消Asynctask的正确方法

时间:2015-07-22 08:59:39

标签: android android-asynctask

这是取消AsyncTask的正确方法吗?

loginButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            RequestTask requestTask = new RequestTask();
            requestTask.execute();
            while(requestTask.isCancelled()) {
                if (requestTask.isCancelled())
                    Toast.makeText(getApplicationContext(), "Failed!", Toast.LENGTH_SHORT).show();
            }
        }
    });

我在if循环中使用了while。我真的不知道这些陈述是否正确。

@Override
    protected String doInBackground(String... strings) {
        String[] kx_var_array = new String[10];
        String returnString = "";
        final TelephonyManager telephonyManager = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
        final String deviceId, deviceSerial, deviceAndroidId;

        deviceId = "" + telephonyManager.getDeviceId();
        deviceSerial = "" + telephonyManager.getSimSerialNumber();
        deviceAndroidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
        while (!isCancelled()){
        if (cd.isConnectingToInternet()) {

            Context context = getApplicationContext();
            final HttpClient httpClient = new DefaultHttpClient();
            //email und passwort aus den Feldern in Variablen speichern
            String URLEmail = email.getText().toString().replace(" ", "");
            String URLPassword = password.getText().toString();

            if (URLEmail.length() > 128) {
                Toast.makeText(context, "Email-Adresse ist zu Lang!", Toast.LENGTH_SHORT).show();
                return null;
            } else if (URLPassword.length() > 64) {
                Toast.makeText(context, "Passwort ist zu Lang!", Toast.LENGTH_SHORT).show();
                return null;
            }


            //Response vom Server
            HttpGet httpGet = new HttpGet(URL);
            //HttpResponse httpResponse = httpClient.execute(new HttpGet(URL));
            //Empfange Daten
            //returnString = EntityUtils.toString(httpResponse.getEntity());
            returnString = null;
            if (returnString == null) {
                cancel(true);
                dialog.dismiss();
                break;
            }
        }
    }

    return returnString;
}

protected void onPostExecute(String result) {
    if (dialog.isShowing()) dialog.dismiss();
    if (result != null) setKx_map(result);
    else {
        Toast.makeText(getApplicationContext(), "Laden fehlgeschlagen", Toast.LENGTH_SHORT).show();
        finish();
    }

为了测试目的,我设置了returnString == null。 我想确定如果我从服务器上取回任何内容,AsyncTask会停止,而不会占用更多时间和资源。

1 个答案:

答案 0 :(得分:2)

上述代码段有几处错误:

  • 首先,不要在email内访问passworddoInBackground - 在单独的线程上执行,并且可以创建竞争条件。在创建AsyncTask之前从视图中获取值,然后将它们作为参数传递。
  • 其次,你为什么要循环?您的代码段似乎反复无限地将电子邮件和密码发送到服务器,直到收到空响应为止。
  • 第三,在您的第一个代码段中,while循环永远不会实际执行:requestTask.isCancelled()cancel()上调用requestTask之前无法成真。< / LI>

在我的第一个代码段中向,您尝试等待AsyncTask完成处理,然后如果失败则打印一条消息。这不会起作用,也不应该起作用,因为它违背了AsyncTask的要点:在不阻止执行其余代码的情况下执行某项任务。当您的AsyncTask甚至开始执行时,您的第一个代码段中的最后几行代码将成为该线程执行中的远程内存。如果您想要打印错误消息,并且使用cancel()表示您希望如何发出信号,请覆盖onCancelled中的AsyncTask