Установить функцию тайм-аута с AsyncTask [Android]

В моем случае я хотел бы нажать кнопку и получить процесс с таймаутом. Когда кнопка нажата, она будет проверять accNo с веб-службами, если проверка (ProgressDialog) превышает 5 секунд, тогда она останавливается и отображает alertDialog, чтобы заметить пользователя "Timeout".

Но теперь я понятия не имею, когда я тестирую с 1 миллисекундами, по логике он будет останавливаться в alertDialog до тех пор, пока не будет нажата кнопка, но теперь он будет отображать диалоговое окно в миллисекундах, затем автоматически отключаться и намереваться перейти к следующему действию. Вот мой код:

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_information3);

btn_next.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (title.getText().toString().equals("INFO")) {
                InfoAsyncTask infoAsyncTask = new InfoAsyncTask();
                try {
                    infoAsyncTask.execute().get(1, TimeUnit.MILLISECONDS);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    AlertDialog.Builder alertDialog = new AlertDialog.Builder(Information3.this);
                    alertDialog.setTitle(":: Error ::");
                    alertDialog.setMessage("Verify Timeout. Please try again.");

                    alertDialog.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
                    alertDialog.show();
                }
           }
       });
   }

private class InfoAsyncTask extends AsyncTask<Void, Void, String> {
    private String results;
    private ProgressDialog pDialog;
    private Object resultRequestSOAP;
    String accNo = et_accNo.getText().toString().trim();
    int timeout = 15000;

    @Override
    protected void onPreExecute() {
        pDialog = new ProgressDialog(Information3.this);
        pDialog.setMessage("Verifying...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(Void... params) {
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        request.addProperty("Code", InfoCode);
        request.addProperty("AccNo", accNo);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL, timeout);
        androidHttpTransport.debug = true;

        try {
            androidHttpTransport.call(SOAP_ACTION, envelope);
            String requestDumpString = androidHttpTransport.requestDump;
            Log.d("request Dump: ", requestDumpString);
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            resultRequestSOAP = envelope.getResponse();
            results = resultRequestSOAP.toString();
            Log.d("Output: ", results);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    protected void onPostExecute(String result) {
        if (resultRequestSOAP == null) {
            if (pDialog.isShowing()) {
                pDialog.dismiss();
            } else {
                AlertDialog.Builder alertDialog = new AlertDialog.Builder(Information3.this);

                alertDialog.setTitle(":: Error ::");
                alertDialog.setMessage("Connection error, please check your internet connection.");

                alertDialog.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                alertDialog.show();
                pDialog.dismiss();
            }
        } else {
            if (results.equals("false")) {
                AlertDialog.Builder alertDialog = new AlertDialog.Builder(Information3.this);

                alertDialog.setTitle(":: Warning ::");
                alertDialog.setMessage("Please fill in correct account number");

                alertDialog.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                alertDialog.show();
            } else if (et_billNo.getText().toString().trim().isEmpty()) {
                AlertDialog.Builder alertDialog = new AlertDialog.Builder(Information3.this);

                alertDialog.setTitle(":: Warning ::");
                alertDialog.setMessage("Please fill in bill number");

                alertDialog.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                alertDialog.show();
            } else if (et_amountNo.getText().toString().trim().isEmpty() || Integer.parseInt(et_amountNo.getText().toString().trim()) <= 0) {
                AlertDialog.Builder alertDialog = new AlertDialog.Builder(Information3.this);

                alertDialog.setTitle(":: Warning ::");
                alertDialog.setMessage("Please fill in amount");

                alertDialog.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                alertDialog.show();
            } else if (results.equals("true")) {
                Title = title.getText().toString();
                String value1 = et_accNo.getText().toString().trim();
                String value2 = et_billNo.getText().toString().trim();
                int value3 = Integer.parseInt(et_amountNo.getText().toString().trim());

                addSearchInput(value1);
                addSearchInput(value2);
                addSearchInput(String.valueOf(value3));

                Intent intent = new Intent(Information3.this, confirmation3.class);
                intent.putExtra("name", Title);
                intent.putExtra("value1", value1);
                intent.putExtra("value2", value2);
                intent.putExtra("value3", value3);
                startActivity(intent);
            } else {
                super.onPreExecute();
            }
            pDialog.dismiss();
        }
    }
}

1 ответ

Решение

Метод get () заблокирует поток пользовательского интерфейса, и я думаю, вы этого не хотите.

Вы должны реализовать отмену механики в doInBackground и вызовите AsyncTask.cancel () по тайм-ауту [вот так] ( https://developer.android.com/reference/android/os/Handler.html, long))

final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
      @Override
      public void run() {
        AsyncTask.cancel();
      }
    }, 1);

Знайте, что есть много ошибок с AsyncTask, проверьте мою статью.

Другие вопросы по тегам