这是取消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
会停止,而不会占用更多时间和资源。
答案 0 :(得分:2)
上述代码段有几处错误:
email
内访问password
或doInBackground
- 在单独的线程上执行,并且可以创建竞争条件。在创建AsyncTask
之前从视图中获取值,然后将它们作为参数传递。while
循环永远不会实际执行:requestTask.isCancelled()
在cancel()
上调用requestTask
之前无法成真。< / LI>
在我的第一个代码段中向看,您尝试等待AsyncTask
完成处理,然后如果失败则打印一条消息。这不会起作用,也不应该起作用,因为它违背了AsyncTask
的要点:在不阻止执行其余代码的情况下执行某项任务。当您的AsyncTask
甚至开始执行时,您的第一个代码段中的最后几行代码将成为该线程执行中的远程内存。如果您想要打印错误消息,并且使用cancel()
表示您希望如何发出信号,请覆盖onCancelled
中的AsyncTask
。