Получить данные с сервера с помощью AsyncTask - PullRequest
0 голосов
/ 29 августа 2018

В моей программе несколько значений хранятся на сервере. Я читаю эти данные, используя класс AsyncTask с сервера.

Это мой код:

public class TestActivity extends AppCompatActivity {
    private static List<String> mPackName;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mPackName = new ArrayList<>();
        try {
            boolean check = new GetDataAsyncTask().execute("1234567").get();
        } catch (InterruptedException e) {

        } catch (ExecutionException e) {
            e.printStackTrace();
            e.printStackTrace();
        }

    }

    private class GetDataAsyncTask extends AsyncTask<String, Void, Boolean> {

        @Override
        protected Boolean doInBackground(String... params) {
            final String mCode = params[0];

            APIGettingPosts apiGettingPosts = new APIGettingPosts(TestActivity.this, "get_off_code.php");
            apiGettingPosts.getOffCode(new APIGettingPosts.OnOffCodeReceived() {
                @Override
                public void onReceived(List<Posts> posts) {
                    if (!(posts == null || posts.isEmpty()))
                        for (int i = 0; i < posts.size(); ++i) {
                            mPackName.add(posts.get(i).getTitle());
                            Log.e("mPackName["+String.valueOf(i)+"]",mPackName.get(i));
                        }
                }
            });
            Log.e("Size of mPackName: ", String.valueOf(mPackName.size()));

            for (int i = 0; i < mPackName.size(); ++i)
                if (mCode.equals(mPackName.get(i))) {
                    Log.e("Is Equal: ", mPackName.get(i));
                    return true;
                }
            return false;
        }
    }
}

Программа правильно получает данные с сервера и сохраняет их в списке mPackName. В конце функции doInBackground программа проверяет, существует ли входное значение в функции GetDataAsyncTask().execute("1234567") в списке mPackName, и возвращает значение true.

Хотя входное значение функции GetDataAsyncTask().execute("1234567") находится в списке mPackName, программа возвращает значение false.

Вывод Log cat выглядит следующим образом:

08-28 / com.green E / Размер mPackName :: 0

08-28 / com.green E / mPackName [0]: 1234567

08-28 / com.green E / mPackName [1]: QAZXSWE

08-28 / com.green E / mPackName [2]: QWERTYU

Размер списка mPackName также равен нулю в Log cat, хотя он имеет три значения {'1234567','QAZXSWE','QWERTYU'}.

Вопрос: Как мне найти значение «1234567» в списке mPackName, чтобы вернуть значение true в check = new GetDataAsyncTask().execute("1234567").get(); код

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Отредактированный ответ

Похоже, вам даже не нужно AsyncTask, так как getOffCode метод уже выполняется в фоновом потоке .

Удалите GetDataAsyncTask класс и создайте метод, как показано ниже.

private void search(final SearchCallback callback) {
    APIGettingPosts apiGettingPosts = new APIGettingPosts(TestActivity.this, "get_off_code.php");
    apiGettingPosts.getOffCode(new APIGettingPosts.OnOffCodeReceived() {
        @Override
        public void onReceived(List<Posts> posts) {
            if (!(posts == null || posts.isEmpty())) {
                for (int i = 0; i < posts.size(); ++i) {
                    mPackName.add(posts.get(i).getTitle());
                    Log.e("mPackName[" + String.valueOf(i) + "]", mPackName.get(i));
                    if (mCode.equals(mPackName.get(i))) {
                        callback.onSearchFound(true);
                        break;
                    }
                }
            }
            callback.onSearchFound(false);
        }
    });
}

public interface SearchCallback{
    void onSearchFound(boolean success);
}

Затем вызовите метод onCreate, как показано ниже

search(new SearchCallback(){
    @Override
    public void onSearchFound(boolean success) {

    }
});
0 голосов
/ 29 августа 2018

Попробуйте поместить переключатель в методе onPostExecute ().

EG.

...

private class GetDataAsyncTask extends AsyncTask<String, Void, Boolean> {

@Override
void onPostExecute(Object o){
    handleResults()
}

...

void handleResults(){
// Insert your check here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...