我有一个将数据发送到服务器的应用程序,有时会出现以下消息:Android应用程序没有响应,关闭它? (我不知道英文是否相同)
很难看到日志,因为它大约在它们全部工作的时候发生在20个设备中的一个中,而我当时无法看到日志。 我认为问题可能在于将数据发送到服务器的Asynctask函数。
这是功能:
class UpdateCandidatos extends AsyncTask<String, String, String> {
protected String doInBackground(String... args) {
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", Nombres.getPID()));
params.add(new BasicNameValuePair("test", nombre));
params.add(new BasicNameValuePair("pregunta", npregunta));
params.add(new BasicNameValuePair("bateria", levelstring));
params.add(new BasicNameValuePair("correctas", correctasString));
params.add(new BasicNameValuePair("errores", fallosString));
JSONObject json = jsonParser.makeHttpRequest(url_update,
"POST", params);
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
} else {
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}
当它被称为asynctask函数时:
bNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count++;
if (radBotA.isChecked()) {
Respuestas[posicion] = "A";
}
else if (radBotB.isChecked()) {
Respuestas[posicion] = "B";
}
else if (radBotC.isChecked()) {
Respuestas[posicion] = "C";
}
else if (radBotD.isChecked()) {
Respuestas[posicion] = "D";
}
else {
Respuestas[posicion] = "";
}
if (Titulacion.IsReachable1(getApplicationContext())) {
Correccion();
new UpdateCandidatos().execute();
}
}
});
有一段时间后,即使您点击应用程序继续阻止的任何按钮,也会显示该消息。我的asynctask函数有什么问题吗?我怎么能解决这个问题?
编辑:Correccion()正在比较2个数组。
public void Correccion(){
correctas = 0;
fallos = 0;
sinresponder = 0;
for(int posicion=0;posicion<=nPreguntas-1;posicion++){
if(Respuestas[posicion].equals(RespuestasC[posicion])){
correctas++;
}
else if(Respuestas[posicion].equals("")){
sinresponder++;
}
else{
fallos++;
}
}
correccion++;
correctasString = String.valueOf(correctas);
fallosString = String.valueOf(fallos);
}
isReachable()用于了解设备是否可以访问服务器。
public static boolean IsReachable1(Context context) {
final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo netInfo = connMgr.getActiveNetworkInfo();
boolean isReachable = false;
if (netInfo != null && netInfo.isConnected()) {
try {
URL url = new URL("http://10.0.0.15/");
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setConnectTimeout(1 * 200);
urlc.connect();
isReachable = (urlc.getResponseCode() == 200);
} catch (IOException e) {
Log.e("TAG", e.getMessage());
}
}
return isReachable;
}
答案 0 :(得分:2)
如果您在按钮上多次单击,则会启动几个asyncTask,我建议:
代码:
myTask = new GetDeviceLogTask();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null);
else
myTask.execute((Void[]) null);
修改强>
好的我认为你在主线程上做了很多事情,通常只用于更新用户界面,你可能不会用于caluclations。因此,请尝试在异步任务中移动Correccion()
和.IsReachable1()
:
class UpdateCandidatos extends AsyncTask<String, String, String> {
protected String doInBackground(String... args) {
if (!Titulacion.IsReachable1(getApplicationContext())) {
return null;
}
Correccion();
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", Nombres.getPID()));
params.add(new BasicNameValuePair("test", nombre));
params.add(new BasicNameValuePair("pregunta", npregunta));
params.add(new BasicNameValuePair("bateria", levelstring));
params.add(new BasicNameValuePair("correctas", correctasString));
params.add(new BasicNameValuePair("errores", fallosString));
JSONObject json = jsonParser.makeHttpRequest(url_update,
"POST", params);
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
} else {
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}