我正在尝试使用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;
}
我做错了什么?
答案 0 :(得分:1)
问题不在于AsyncTask调用静态方法。那也将执行异步。问题是您正在显示进度对话框,直到您的任务完成。当然,当您的进度对话框可见时,您将无法与UI进行交互。如果您想与UI进行交互,请以其他方式显示您的进度,而不是使用对话框。
答案 1 :(得分:1)
您在屏幕顶部显示progressDialog。进度对话框采用UI交互,因此下面的按钮不响应。如果在UI中使用进度条而不是进度对话框,则按钮将起作用。
答案 2 :(得分:0)
如果要向用户显示任务的进度,请使用方法onProgressUpdate,因为它已实现为在UI线程上运行。
现在,每次要显示doInBackground的进度时,都要通过传递参数来调用它。为了清楚起见, AsyncTask(String,Integer,String)使用参数类型:
答案 3 :(得分:0)
我不确定我是否明白你的问题是什么,但在我看来,你不能与UI互动,因为ProgressDialog不可取消,而且它在其他一切之前。 只有在解除对话框时才会收到反馈。