Android:Android App没有响应,关闭它?

时间:2013-10-10 09:34:18

标签: android error-handling

我有一个将数据发送到服务器的应用程序,有时会出现以下消息: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;
    }

1 个答案:

答案 0 :(得分:2)

如果您在按钮上多次单击,则会启动几个asyncTask,我建议:

  1. 避免多项任务:等待上一次执行结束
  2. 使用以下代码启动任务:
  3. 代码:

    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;
        }
    }