Почему мой ArrayList теряет все свои данные из ниоткуда в AsyncTask Android Studio - PullRequest
0 голосов
/ 18 марта 2020

Так что в основном у меня возникла эта проблема в этот последний час или около того, и раньше ее не было.

В моей основной деятельности у меня есть собственный RecyclerView и imageView с перезагрузкой pi c в нем, чтобы перезагрузить данные.

Вот переменные, вовлеченные в это на моей MainActivity:

    public class MainActivity extends AppCompatActivity {

    private ArrayList<Integer> listFavorites;
    private ArrayList<StationVelo> listStations;
    private RecyclerViewAdapter adapter;

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

        listFavorites = new ArrayList<>();
        listStations = new ArrayList<>();
        initRecyclerView();
        chargeStations();

        ImageView ivRefresh = findViewById(R.id.ivRefresh);
        ivRefresh.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                chargeStations();
            }
        });

     }
}

Вот как выглядит InitRecyclerview ():

    public void initRecyclerView(){
    RecyclerView recyclerView = findViewById(R.id.listView);

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(linearLayoutManager);

    DividerItemDecoration mDividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
            linearLayoutManager.getOrientation());
    recyclerView.addItemDecoration(mDividerItemDecoration);

    adapter = new RecyclerViewAdapter(this, listStations);
    recyclerView.setAdapter(adapter);

}

Вот то, как наделен chargeStations ():

    public void chargeStations(){
    listStations.clear();
    chargeListFavorites();
    new AsyncTaskJcdecaux().execute(listStations, adapter, listFavorites);
}

Вот как выглядит chargeListFoving ():

    private void chargeListFavorites() {
    listFavorites.clear();
    File directory = this.getFilesDir();
    File file = new File(directory, "favorite_stations");
    if(file.exists()){
        FileInputStream fis;
        ObjectInputStream in = null;
        try {
            fis = openFileInput("favorite_stations");
            in = new ObjectInputStream(fis);
            listFavorites = (ArrayList<Integer>) in.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Вот как выглядит мой AsyncTaskJCDecaux:

public class AsyncTaskJcdecaux extends AsyncTask<Object, Void, String> {
private ArrayList<StationVelo> listStations;
private RecyclerViewAdapter adapter;
private ArrayList<Integer> listFavorites;
@Override
protected String doInBackground(Object... params) {

    listStations = (ArrayList<StationVelo>) params[0];

    adapter = (RecyclerViewAdapter) params[1];

    listFavorites = (ArrayList<Integer>) params[2];

    System.out.println("size =" + listFavorites.size());

    HttpsURLConnection urlConnection = null;
    String stringJson = "";
    StringBuilder strBuilder = new StringBuilder();

    try {
        //Connexion to JCDecaux's API
        URL url = new URL("url to my api that i didn't put on here but it has no issues");
        urlConnection = (HttpsURLConnection) url.openConnection();
        System.out.println("first call of size size = " + listFavorites.size());

        //Charging the url to the API and building a string with the JSON data
        if (urlConnection.getResponseCode() == HttpsURLConnection.HTTP_OK) {
            System.out.println("second call of size =" + listFavorites.size());

            InputStreamReader isr = new InputStreamReader(urlConnection.getInputStream());

            BufferedReader input = new BufferedReader(isr);
            String jsonStr = input.readLine();
            strBuilder.append(jsonStr);

            //Adding a line to the string builder
            while(jsonStr!=null && !jsonStr.equals("")){
                jsonStr = input.readLine();
                strBuilder.append(jsonStr);
            }
            input.close();
        }
    }catch(MalformedURLException e){
        e.printStackTrace();
    } catch(IOException e){
        e.printStackTrace();
    } finally {
        System.out.println("third call of size =" + listFavorites.size());
        urlConnection.disconnect();
        System.out.println("size =" + listFavorites.size());
    }

    stringJson = strBuilder.toString();

    System.out.println("fourth call of size =" + listFavorites.size());

    //charging all the stations
    if(!stringJson.equals("")){
        try {

            JSONArray jArray = new JSONArray(stringJson);
            int length = jArray.length();

            for(int i=0; i<length; i++){

                String nameStation = jArray.getJSONObject(i).getString("name").toLowerCase();

                String[] strArray = nameStation.split(" ");
                StringBuilder builder = new StringBuilder();
                for (String s : strArray) {
                    if(s.length()>0) {
                        String cap = s.substring(0, 1).toUpperCase() + s.substring(1);
                        builder.append(cap + " ");
                    }
                }

                nameStation = builder.toString();

                String addressStation = jArray.getJSONObject(i).getString("address").toLowerCase();

                String[] strArray2 = addressStation.split(" ");
                builder = new StringBuilder();
                for (String s : strArray2) {
                    if(s.length()>0) {
                        String cap = s.substring(0, 1).toUpperCase() + s.substring(1);
                        builder.append(cap + " ");
                    }

                }
                addressStation = builder.toString();

                if(listFavorites.contains(jArray.getJSONObject(i).getInt("number"))){
                    StationVelo stVelo = new StationVelo(jArray.getJSONObject(i).getInt("number"),
                            nameStation
                            ,addressStation
                            ,Double.valueOf(jArray.getJSONObject(i).getJSONObject("position").getString("lat"))
                            ,Double.valueOf(jArray.getJSONObject(i).getJSONObject("position").getString("lng"))
                            ,jArray.getJSONObject(i).getString("status").equals("OPEN")
                            ,jArray.getJSONObject(i).getBoolean("banking")
                            ,Integer.valueOf(jArray.getJSONObject(i).getString("bike_stands"))
                            ,Integer.valueOf(jArray.getJSONObject(i).getString("available_bike_stands"))
                            ,Integer.valueOf(jArray.getJSONObject(i).getString("available_bikes")),
                            true);
                    listStations.add(stVelo);
                }else {
                    StationVelo stVelo = new StationVelo(jArray.getJSONObject(i).getInt("number"),
                            nameStation
                            ,addressStation
                            ,Double.valueOf(jArray.getJSONObject(i).getJSONObject("position").getString("lat"))
                            ,Double.valueOf(jArray.getJSONObject(i).getJSONObject("position").getString("lng"))
                            ,jArray.getJSONObject(i).getString("status").equals("OPEN")
                            ,jArray.getJSONObject(i).getBoolean("banking")
                            ,Integer.valueOf(jArray.getJSONObject(i).getString("bike_stands"))
                            ,Integer.valueOf(jArray.getJSONObject(i).getString("available_bike_stands"))
                            ,Integer.valueOf(jArray.getJSONObject(i).getString("available_bikes")),
                            false);
                    listStations.add(stVelo);
                }

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

    }

    return "true";
}

@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
    adapter.notifyDataSetChanged();
}

}

И, как вы можете видеть, я печатаю в четыре раза больше, чем ListFavor. Вот что происходит при первом вызове функции chargeStations.

И вот что происходит, когда я перезагружаю данные, и что теперь отображают вызовы.

Я буквально хочу покончить с собой, поскольку этого не должно происходить, и я не могу найти никакого объяснения этой ошибке, ошибке или какому-то другому адскому чудовищу. Я скопировал и вставил только те части, которые не работают. Никаких проблем не происходит из-за моего класса Station, но если вы хотите увидеть его или мой RecyclerAdapter, я бы с удовольствием опубликовал их.

1 Ответ

0 голосов
/ 18 марта 2020

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

Так вот, что я делаю сейчас, я передаю Context вместо listFlected моему asyncTask и я скопировал свою функцию, которая загружает данные в ListFoving из ASyncTask напрямую.

Что я изменил в моей MainActivity:

public void chargeStations(){
    new AsyncTaskJcdecaux().execute(listStations, adapter, this);
}

Как теперь выглядит мой AsyncTask:

public class AsyncTaskJcdecaux extends AsyncTask<Object, Void, String> {
private ArrayList<StationVelo> listStations;
private RecyclerViewAdapter adapter;
private Context context;
private ArrayList<Integer> listFavorites;
@Override
protected String doInBackground(Object... params) {

    listStations = (ArrayList<StationVelo>) params[0];

    adapter = (RecyclerViewAdapter) params[1];

    context = (Context) params[2];

    HttpsURLConnection urlConnection = null;
    String stringJson = "";
    StringBuilder strBuilder = new StringBuilder();

    try {
        //Connexion to JCDecaux's API
        URL url = new URL("the URL of my API");
        urlConnection = (HttpsURLConnection) url.openConnection();
        //Charging the url to the API and building a string with the JSON data
        if (urlConnection.getResponseCode() == HttpsURLConnection.HTTP_OK) {

            InputStreamReader isr = new InputStreamReader(urlConnection.getInputStream());

            BufferedReader input = new BufferedReader(isr);
            String jsonStr = input.readLine();
            strBuilder.append(jsonStr);

            //Adding a line to the string builder
            while(jsonStr!=null && !jsonStr.equals("")){
                jsonStr = input.readLine();
                strBuilder.append(jsonStr);
            }
            input.close();
        }
    }catch(MalformedURLException e){
        e.printStackTrace();
    } catch(IOException e){
        e.printStackTrace();
    } finally {
        urlConnection.disconnect();
    }

    stringJson = strBuilder.toString();

    //charging all the stations
    if(!stringJson.equals("")){
        try {

            JSONArray jArray = new JSONArray(stringJson);
            int length = jArray.length();
            listFavorites = new ArrayList<>();
            chargeListFavorites();
            System.out.println("listFavorites size =" + listFavorites.size());

            for(int i=0; i<length; i++){

                String nameStation = jArray.getJSONObject(i).getString("name").toLowerCase();

                String[] strArray = nameStation.split(" ");
                StringBuilder builder = new StringBuilder();
                for (String s : strArray) {
                    if(s.length()>0) {
                        String cap = s.substring(0, 1).toUpperCase() + s.substring(1);
                        builder.append(cap + " ");
                    }
                }

                nameStation = builder.toString();

                String addressStation = jArray.getJSONObject(i).getString("address").toLowerCase();

                String[] strArray2 = addressStation.split(" ");
                builder = new StringBuilder();
                for (String s : strArray2) {
                    if(s.length()>0) {
                        String cap = s.substring(0, 1).toUpperCase() + s.substring(1);
                        builder.append(cap + " ");
                    }

                }
                addressStation = builder.toString();

                if(listFavorites.contains(jArray.getJSONObject(i).getInt("number"))){
                    StationVelo stVelo = new StationVelo(jArray.getJSONObject(i).getInt("number"),
                            nameStation
                            ,addressStation
                            ,Double.valueOf(jArray.getJSONObject(i).getJSONObject("position").getString("lat"))
                            ,Double.valueOf(jArray.getJSONObject(i).getJSONObject("position").getString("lng"))
                            ,jArray.getJSONObject(i).getString("status").equals("OPEN")
                            ,jArray.getJSONObject(i).getBoolean("banking")
                            ,Integer.valueOf(jArray.getJSONObject(i).getString("bike_stands"))
                            ,Integer.valueOf(jArray.getJSONObject(i).getString("available_bike_stands"))
                            ,Integer.valueOf(jArray.getJSONObject(i).getString("available_bikes")),
                            true);
                    listStations.add(stVelo);
                }else {
                    StationVelo stVelo = new StationVelo(jArray.getJSONObject(i).getInt("number"),
                            nameStation
                            ,addressStation
                            ,Double.valueOf(jArray.getJSONObject(i).getJSONObject("position").getString("lat"))
                            ,Double.valueOf(jArray.getJSONObject(i).getJSONObject("position").getString("lng"))
                            ,jArray.getJSONObject(i).getString("status").equals("OPEN")
                            ,jArray.getJSONObject(i).getBoolean("banking")
                            ,Integer.valueOf(jArray.getJSONObject(i).getString("bike_stands"))
                            ,Integer.valueOf(jArray.getJSONObject(i).getString("available_bike_stands"))
                            ,Integer.valueOf(jArray.getJSONObject(i).getString("available_bikes")),
                            false);
                    listStations.add(stVelo);
                }

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

    }

    return "true";
}

@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
    adapter.notifyDataSetChanged();
}


private void chargeListFavorites() {
    File directory = context.getFilesDir();
    File file = new File(directory, "favorite_stations");
    if(file.exists()){
        FileInputStream fis;
        ObjectInputStream in = null;
        try {
            fis = context.openFileInput("favorite_stations");
            in = new ObjectInputStream(fis);
            listFavorites = (ArrayList<Integer>) in.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

}

...