OutOfMemoryError: pthread_create при попытке сделать http-запрос - PullRequest
0 голосов
/ 13 июня 2019

Я выполняю 2 HTTP запросов один за другим.

Первый получает массив целых чисел, а второй использует каждое целое число для создания нового запроса HTTP и на основе этого результата создает объект.Когда код достигает 2-го HTTP запроса, он завершается ошибкой pthread create, что я понятия не имею, что это такое.

вот мое действие -


public class MainActivity extends AppCompatActivity {

    private RecyclerView newsRecyclerView;
    private NewsAdapter newsAdapter;
    private List<NewsItem> newsItemList;
    private LinearLayoutManager linearLayoutManager;
    private HttpRequest httpRequest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
        networkRequest();
    }

    private void networkRequest() {
        httpRequest = new HttpRequest(this, Global.TOP_STORIES, new HttpRequest.OnHttpCompleteListener() {
            @Override
            public void onComplete(String response) {
                createNewsList(response);

            }

            @Override
            public void onError(String error) {
                Log.i("error", error);
            }
        });
        httpRequest.request();
    }

    private void createNewsList(String response) {
        final Gson gson = new Gson();
        int[] topStories = gson.fromJson(response, int[].class);
        for (int i = 0; i < topStories.length; i++) {
            String url = Global.BASE_NEWS_URL + topStories[i] + Global.NEWS_ENDPOINT;
            httpRequest = new HttpRequest(this, url, new HttpRequest.OnHttpCompleteListener() {
                @Override
                public void onComplete(String response) {
                    NewsItem newsItem = gson.fromJson(response, NewsItem.class);
                    if (newsItem != null) {
                        newsItemList.add(newsItem);
                    }
                    Log.i("number of news items", "number of newsItems " + newsItemList.size());
                }

                @Override
                public void onError(String error) {
                    Log.i("create list error", error);
                }
            });
            httpRequest.request();
        }
    }

    private void initViews() {
        newsRecyclerView = findViewById(R.id.newsRecyclerView);
        newsItemList = new ArrayList<>();
        linearLayoutManager = new LinearLayoutManager(this);
        newsAdapter = new NewsAdapter(newsItemList, new NewsAdapter.OnNewsListItemClicked() {
            @Override
            public void onNewsItemClicked(int position) {

            }
        });
        newsRecyclerView.setAdapter(newsAdapter);
        newsRecyclerView.setHasFixedSize(true);
        newsRecyclerView.setLayoutManager(linearLayoutManager);

    }
}

, а вот мой класс HttpRequest -


public class HttpRequest {

    private Context context;
    private String url;
    private OnHttpCompleteListener onHttpCompleteListener;
    private RequestQueue queue;

    public HttpRequest(Context context, String url, OnHttpCompleteListener onHttpCompleteListener) {
        this.context = context;
        this.url = url;
        this.onHttpCompleteListener = onHttpCompleteListener;
        queue = Volley.newRequestQueue(context);

    }



    public void request(){
        RequestQueue queue = Volley.newRequestQueue(context);

        StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                if (response != null){
                    onHttpCompleteListener.onComplete(response);
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                onHttpCompleteListener.onError(error.getMessage());
            }
        });
        queue.add(stringRequest);
    }


    public interface OnHttpCompleteListener{
        void onComplete(String response);
        void onError(String error);
    }
}


Когда он не справляется с проблемой pthread, он переходит к следующей строке внутрикласс HttpRequest -

RequestQueue queue = Volley.newRequestQueue(context);

Я использовал документацию для залпа, и я действительно не знаю, что пошло не так.

...