0

サーバーにデータを送信するアプリケーションを使用していますが、次のメッセージが表示されることがあります: 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;
    }
4

1 に答える 1

2

ボタンを数回クリックすると、いくつかの asyncTask が開始されます。

  1. 複数のタスクを避ける: 前の実行終了を待つ
  2. 次のコードを使用して、タスクを開始します。

コード:

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

編集:

わかりました、通常はユーザー インターフェイスを更新するためだけに使用され、計算には使用しないメイン スレッドで多くのことを行っていると思います。したがって、非同期タスク内に移動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;
    }
}
于 2013-10-10T09:42:13.077 に答える