来自 AsyncTask 的静态方法调用是异步的?
Static method call from AsyncTask is async?
我正在尝试使用 AsyncTask
检查互联网连接是否可用,然后做一些事情。
我的问题是在执行缓刑期间我无法与 UI
互动。 “progressbar
”在前面,如果我尝试单击按钮,UI
没有响应
这是对 AsyncTask 的调用
@Override
public void onStart(){
super.onStart();
AsyncHttpHandler check = new AsyncHttpHandler(**paramaters**);
check.execute("checkshared");
}
这是AsyncTask的代码
public class AsyncHttpHandler extends AsyncTask<String, Integer, String>{
public AsyncHttpHandler(Context c, Intent i, Bundle _data, String _language){
ctx = c;
intent = i;
data = _data;
language = _language;
startClock();
}
public void startClock(){
mDialog = new ProgressDialog(ctx,R.style.MyTheme);
mDialog.setProgressStyle(android.R.style.Widget_ProgressBar_Small);
mDialog.setCancelable(false);
mDialog.show();
}
@SuppressWarnings("unchecked")
@Override
protected String doInBackground(String... peticion) {
String response = "null";
//call to check if internet connection is available
if(Utils.isInternetConn(ctx)){
try {
// do stuff
response = "...";
}
else response = "offline";
return response;
}
}
protected void onPostExecute(String response) {
if(mDialog != null) mDialog.dismiss();
if(!response.equals("offline")){
// do stuff
}
else Toast.makeText(ctx, ctx.getResources().getString(ctx.getResources().getIdentifier(language+"_toast_nointernet", "string", ctx.getPackageName())), Toast.LENGTH_LONG).show();
}
}
这是检查互联网连接是否可用的方法:
public static Boolean isInternetConn(Context ctx){
ConnectivityManager connec = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifi = connec.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobile = connec.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
boolean conectado = false;
if((wifi != null && wifi.isConnectedOrConnecting()) || (mobile != null && mobile.isConnectedOrConnecting())){
try {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
URL myurl = new URL("http://www.google.com");
URLConnection connection;
connection = myurl.openConnection();
connection.setConnectTimeout(2000);
connection.setReadTimeout(2000);
HttpURLConnection httpConnection = (HttpURLConnection) connection;
int responseCode = -1;
responseCode = httpConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
conectado = true;
httpConnection.disconnect();
}
else {
httpConnection.disconnect();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return conectado;
}
我做错了什么?
问题不在于您的 AsyncTask 调用静态方法。这也将执行异步。问题是您在任务完成之前显示进度对话框。当然,当您的进度对话框可见时,您将无法与 UI 进行交互。如果您想与 UI 互动,请以另一种方式显示您的进度,而不是通过对话。
您在屏幕顶部显示一个进度对话框。进度对话框采用 UI 交互,因此下面的按钮没有响应。如果您在 UI 中使用进度条而不是进度对话框,您的按钮将起作用。
如果您想向用户显示任务的进度,请使用方法onProgressUpdate,因为它已在 运行 上实施UI 线程。
现在,每次您想显示 doInBackground 的进度时,通过传递参数来调用它。明确地说,AsyncTask (String, Integer, String) 使用参数类型:
- 首先是调用 execute 时传递的参数类型
- 其次是您传递给 onProgressUpdate 的参数类型
- 第三个是你传递给 onPostExecute 的参数类型
我不确定我是否理解您的问题,但在我看来,您无法与 UI 交互,因为 ProgressDialog 不可取消,而且它位于其他所有内容的前面。
您只会在关闭对话框时收到反馈。
我正在尝试使用 AsyncTask
检查互联网连接是否可用,然后做一些事情。
我的问题是在执行缓刑期间我无法与 UI
互动。 “progressbar
”在前面,如果我尝试单击按钮,UI
没有响应
这是对 AsyncTask 的调用
@Override
public void onStart(){
super.onStart();
AsyncHttpHandler check = new AsyncHttpHandler(**paramaters**);
check.execute("checkshared");
}
这是AsyncTask的代码
public class AsyncHttpHandler extends AsyncTask<String, Integer, String>{
public AsyncHttpHandler(Context c, Intent i, Bundle _data, String _language){
ctx = c;
intent = i;
data = _data;
language = _language;
startClock();
}
public void startClock(){
mDialog = new ProgressDialog(ctx,R.style.MyTheme);
mDialog.setProgressStyle(android.R.style.Widget_ProgressBar_Small);
mDialog.setCancelable(false);
mDialog.show();
}
@SuppressWarnings("unchecked")
@Override
protected String doInBackground(String... peticion) {
String response = "null";
//call to check if internet connection is available
if(Utils.isInternetConn(ctx)){
try {
// do stuff
response = "...";
}
else response = "offline";
return response;
}
}
protected void onPostExecute(String response) {
if(mDialog != null) mDialog.dismiss();
if(!response.equals("offline")){
// do stuff
}
else Toast.makeText(ctx, ctx.getResources().getString(ctx.getResources().getIdentifier(language+"_toast_nointernet", "string", ctx.getPackageName())), Toast.LENGTH_LONG).show();
}
}
这是检查互联网连接是否可用的方法:
public static Boolean isInternetConn(Context ctx){
ConnectivityManager connec = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifi = connec.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobile = connec.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
boolean conectado = false;
if((wifi != null && wifi.isConnectedOrConnecting()) || (mobile != null && mobile.isConnectedOrConnecting())){
try {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
URL myurl = new URL("http://www.google.com");
URLConnection connection;
connection = myurl.openConnection();
connection.setConnectTimeout(2000);
connection.setReadTimeout(2000);
HttpURLConnection httpConnection = (HttpURLConnection) connection;
int responseCode = -1;
responseCode = httpConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
conectado = true;
httpConnection.disconnect();
}
else {
httpConnection.disconnect();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return conectado;
}
我做错了什么?
问题不在于您的 AsyncTask 调用静态方法。这也将执行异步。问题是您在任务完成之前显示进度对话框。当然,当您的进度对话框可见时,您将无法与 UI 进行交互。如果您想与 UI 互动,请以另一种方式显示您的进度,而不是通过对话。
您在屏幕顶部显示一个进度对话框。进度对话框采用 UI 交互,因此下面的按钮没有响应。如果您在 UI 中使用进度条而不是进度对话框,您的按钮将起作用。
如果您想向用户显示任务的进度,请使用方法onProgressUpdate,因为它已在 运行 上实施UI 线程。
现在,每次您想显示 doInBackground 的进度时,通过传递参数来调用它。明确地说,AsyncTask (String, Integer, String) 使用参数类型:
- 首先是调用 execute 时传递的参数类型
- 其次是您传递给 onProgressUpdate 的参数类型
- 第三个是你传递给 onPostExecute 的参数类型
我不确定我是否理解您的问题,但在我看来,您无法与 UI 交互,因为 ProgressDialog 不可取消,而且它位于其他所有内容的前面。 您只会在关闭对话框时收到反馈。