Цикл HttpRequest в AsyncTask - PullRequest
       78

Цикл HttpRequest в AsyncTask

0 голосов
/ 29 апреля 2018

У меня есть строковый массив:

 public static final String[] LACCOUNT =
          {
                    "username=admin1&password=saa123456",
                    "username=admin2&password=klk123456",
                    "username=admin3&password=exf123456",
                    "username=admin4&password=uoq123456",
                    "username=admin5&password=qff123456"
    };

и у меня есть

public void okGet(String URL,  String param) {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(URL  + "?" + param) 
                .get()
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String textResponse = response.body().string();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {



                        if (textResponse.contains(":1")) {
                            progressDialog.dismiss();
                                    Toast.makeText(getActivity(), "YES", Toast.LENGTH_SHORT).show();


                        }
                    }
                });
            }
        });
    }

Я хочу зациклить этот запрос на AsyncTask

Я пытался так, но это не сработало

private class aTaskWorker extends AsyncTask<String, Void, String> {

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            fab1.setVisibility(View.GONE);
            tvLog.setText(s);


            // tvLog.setText(response.body().string());

            // Kondisi
            String strResult = tvLog.getText().toString();
            if (strResult.contains(":1")) {
                // TODO : stop this loop
            } 

        }

        @Override
        protected String doInBackground(String... params) {
            int totAkun = Constans.LACCOUNT.length;
            for (int i = 0; i < totAkun; i++) {
                int counter = i + 1;
                tvTask.setText(counter + " of " + totAkun);
                OKPost(Constans._LOGIN, Constans.LACCOUNT[i]);

            }


            return null;
        }

еще раз, я хочу зациклить этот запрос с AsyncTask

как это сделать?

TQ

1 Ответ

0 голосов
/ 29 апреля 2018

Прежде всего, вам нужно исправить функцию okGet () , чтобы использовать синхронный запрос. Поскольку вы уже используете AsyncTask (асинхронная операция) для зацикливания ваших запросов, запрос должен быть синхронным.

public String tryLogin(String URL, String param) {
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
            .url(URL + "?" + param)
            .get()
            .build();
    try {
        Response response = client.newCall(request).execute();
        if (response != null && response.body() != null) {
            return response.body().string();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

Затем вы модифицируете AsyncTask для этого:

private static class LoginAsyncTask extends AsyncTask<String, Void, Boolean> {
    @Override
    protected Boolean doInBackground(String... accounts) {
        for (String account : accounts) {
            // try to login each account from array of accounts
            String loginResult = tryLogin(Constants.LOGIN, account);
            if (loginResult != null && loginResult.contains(":1")) {
                return true;
            }
        }
        return false;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        // hide progress bar
        if (result) {
            // Successful login
        } else {
            // Failed login
        }
    }
}

Затем вы вызываете AsyncTask с помощью функции ниже:

new LoginAsyncTask().execute(Constants.LACCOUNT);
...