Singleton Android가 데이터에 액세스 할 수 없음

LJP1203

한 클래스에서 데이터를 가져 와서 싱글 톤에 넣은 다음 다른 클래스에서 해당 데이터에 액세스하려고합니다.

내 싱글 톤은 다음과 같습니다.

public class DataTransferrer {
    private static DataTransferrer instance = null;

    private ArrayList<Transients> transientList;

    private DataTransferrer(){
        transientList = new ArrayList<>();
    }

    public static synchronized DataTransferrer getInstance(){
        if(instance == null) {instance = new DataTransferrer();}
        return instance;
    }

    public ArrayList<Transients> getTransients(){return this.transientList;}

    public void setTransients(ArrayList<Transients> t){transientList = t;}

    public void printAll(){
        for(Transients t : transientList){
            Log.d("DEBUG DA",t.getDa().toString());
        }
    }

    }

다음은에 데이터를 추가 arrayList한 다음 arrayList싱글 톤 내에서 설정 한 다음 다른 곳에서 사용하는 방법입니다.

public class JSONParser {

    // URL to get contacts JSON
    private static String url = "http://pi.cs.oswego.edu/~lpatmore/getAllTransients.php";

    ArrayList<Transients> transientList;

    private Transients t;

    public JSONParser(){
        transientList = new ArrayList<>();
    }

    public void execute(){
        new GetTransients().execute();
    }
    /**
     * Async task class to get json by making HTTP call
     */
    private class GetTransients extends AsyncTask<Void, Void, Void> {

        protected Void doInBackground(Void... arg0) {
            HttpHandler sh = new HttpHandler();

            // Making a request to url and getting response
            String jsonStr = sh.makeServiceCall(url);

            Log.d(TAG, "Response from url: " + jsonStr);

            if (jsonStr != null) {
                try {

                    Log.d(TAG, "NOT NULL DEBUG");
                    JSONObject jsonObj = new JSONObject(jsonStr);

                    // Getting JSON Array node
                    JSONArray transients = jsonObj.getJSONArray("result");

                    // looping through All Transients
                    for (int i = 0; i < transients.length(); i++) {
                        JSONObject c = transients.getJSONObject(i);

                        String author = c.getString("author");
                        String transientId = c.getString("transientId");
                        String dateAlerted = c.getString("dateAlerted");
                        String datePublished = c.getString("datePublished");
                        float right_asencsion = (float) c.getDouble("right_asencsion");
                        float declination = (float) c.getDouble("declination");

                        t = new Transients(author, transientId, dateAlerted, datePublished, right_asencsion, declination);

                        // adding trans to trans list
                        transientList.add(t);
                    }
                    DataTransferrer.getInstance().setTransients(transientList);
                    DataTransferrer.getInstance().printAll();
                } catch (final JSONException e) {
                    Log.e(TAG, "Json parsing error: " + e.getMessage());
                }
            } else {
                Log.e(TAG, "Couldn't get json from server.");
            }
            return null;
        }

    }
}

그리고 다음과 같은 다른 클래스에서 액세스하려고합니다.

 for(int i = 0; i <      DataTransferrer.getInstance().getTransients().size(); i++){
        System.out.println("DEBUG ADDED TRANSIENT");
        Float ra = DataTransferrer.getInstance().getTransients().get(i).getR();
        Float dec = DataTransferrer.getInstance().getTransients().get(i).getD();
        transients.add(new Transient("Transient", names[i], GeocentricCoordinates.getInstance(ra, dec)));
    }

다른 클래스에서 확인하기 위해 디버깅 할 때마다에 액세스하려고 arraylist하지만 다른 클래스에서는 getTransients()메서드에 배열 목록이 추가되지 않은 것과 같습니다 .

Eclipse에서이 정확한 설정을 테스트했는데 완벽하게 작동하지만 Android Studio에서는 작동하지 않습니다.

개발자

Eclipse에서이 정확한 설정을 테스트했는데 완벽하게 작동하지만 Android Studio에서는 작동하지 않습니다.

기본적으로 멀티 스레딩 문제가 있습니다. 즉, DataTransferrer클래스가 스레드 안전하지 않아 문제가 발생합니다. 즉, 여러 스레드 사이에 경쟁 조건이 있고 싱글 톤 instance이 실제로 싱글 이 아닙니다 ( DataTransferrer클래스에 대해 여러 객체가 생성됨 ).

따라서 setTransients()한 스레드에서 호출하면 실제로 Transients를 하나 instance저장하고 다른 스레드에서 DataTransferrer검색하려고 할 때 Transients다른 instance(객체)의 DataTransferrer.

DataTransferrer아래와 같이 클래스에 대한 스레드 세이프 싱글 톤 인스턴스를 만들 수 있습니다 .

public class DataTransferrer {

        private static final DataTransferrer instance = new DataTransferrer();

        private ArrayList<Transients> transientList = new ArrayList<>();

        //private constructor, so instantiation NOT allowed
        private DataTransferrer() {}

        public static synchronized DataTransferrer getInstance(){
          return instance;
        }

       public ArrayList<Transients> getTransients(){
           return this.transientList;
       }

        public void setTransients(ArrayList<Transients> t){
            transientList = t;
        }

        public void printAll(){
            for(Transients t : transientList){
                Log.d("DEBUG DA",t.getDa().toString());
            }
        }
 }

또한, 위의 코드에서,주의 instance열심히 만들어집니다 시작 (초기화) 시간과 때 호출시 setTransientsgetTransients같은 것을 instance(싱글)이 사용됩니다. 열성적인 창작 대신 instance게으른 창작이 필요한 경우 여기 를 볼 수 있습니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

SWR 가져 오기에서 내 데이터에 액세스 할 수 없음-React

분류에서Dev

Android Eclipse DDMS-휴대 전화에서 데이터 / 데이터 /에 액세스 할 수 없음

분류에서Dev

개별 JSON 데이터에 액세스 할 수 없음 [AngularJS]

분류에서Dev

이온 커패시터 Android 앱이 인터넷에 액세스 할 수 없음

분류에서Dev

SQLITE 데이터베이스 Android에 액세스 할 수 없습니다.

분류에서Dev

변수에 액세스 할 수 없음

분류에서Dev

clear 명령-터미널 데이터베이스에 액세스 할 수 없음

분류에서Dev

clear 명령-터미널 데이터베이스에 액세스 할 수 없음

분류에서Dev

컨트롤러에서 가져 오기 게시물 데이터에 액세스 할 수 없음 : Codeigniter

분류에서Dev

백엔드에서 데이터를 가져 왔지만 반응에서 액세스 할 수 없음

분류에서Dev

Firebase가 '스냅 샷'으로 데이터에 액세스 할 수 없습니다.

분류에서Dev

Windows Docker 컨테이너가 인터넷에 액세스 할 수 없음

분류에서Dev

android studio fragment onclick에서 edittext에 액세스 할 수 없음

분류에서Dev

영역에서 가져온 데이터에 액세스 할 수 없습니다.

분류에서Dev

PHP Artisan Migration이 MySQL 데이터베이스에 액세스 할 수 없음

분류에서Dev

Android Studio Volley-API에 액세스 할 수 없음

분류에서Dev

Android 6 : 오류 파일에 액세스 할 수 없음

분류에서Dev

AWS Python Lambda가 EFS 파일에 액세스 할 수 없음

분류에서Dev

루트 사용자가 MySql에 액세스 할 수 없음

분류에서Dev

unionfs-fuse가있는 chroot, / dev / *에 액세스 할 수 없음

분류에서Dev

VirtualBox 가상 머신에 갑자기 액세스 할 수 없음

분류에서Dev

AD 사용자가 Samba Share에 액세스 할 수 없음

분류에서Dev

PostgreSQL에 액세스 할 수 없음

분류에서Dev

웹에 액세스 할 수 없음

분류에서Dev

Hashmap에 액세스 할 수 없음

분류에서Dev

사용자가 액세스 할 수없는 데이터베이스에서 데이터 가져 오기

분류에서Dev

Azure Virtual Machine-MySQL 데이터베이스에 액세스 할 수 없음

분류에서Dev

설치시 SQLite 데이터베이스에 액세스 할 수 없음

분류에서Dev

npm 설치가 폴더에 액세스 할 수 없음 (권한 없음)

Related 관련 기사

  1. 1

    SWR 가져 오기에서 내 데이터에 액세스 할 수 없음-React

  2. 2

    Android Eclipse DDMS-휴대 전화에서 데이터 / 데이터 /에 액세스 할 수 없음

  3. 3

    개별 JSON 데이터에 액세스 할 수 없음 [AngularJS]

  4. 4

    이온 커패시터 Android 앱이 인터넷에 액세스 할 수 없음

  5. 5

    SQLITE 데이터베이스 Android에 액세스 할 수 없습니다.

  6. 6

    변수에 액세스 할 수 없음

  7. 7

    clear 명령-터미널 데이터베이스에 액세스 할 수 없음

  8. 8

    clear 명령-터미널 데이터베이스에 액세스 할 수 없음

  9. 9

    컨트롤러에서 가져 오기 게시물 데이터에 액세스 할 수 없음 : Codeigniter

  10. 10

    백엔드에서 데이터를 가져 왔지만 반응에서 액세스 할 수 없음

  11. 11

    Firebase가 '스냅 샷'으로 데이터에 액세스 할 수 없습니다.

  12. 12

    Windows Docker 컨테이너가 인터넷에 액세스 할 수 없음

  13. 13

    android studio fragment onclick에서 edittext에 액세스 할 수 없음

  14. 14

    영역에서 가져온 데이터에 액세스 할 수 없습니다.

  15. 15

    PHP Artisan Migration이 MySQL 데이터베이스에 액세스 할 수 없음

  16. 16

    Android Studio Volley-API에 액세스 할 수 없음

  17. 17

    Android 6 : 오류 파일에 액세스 할 수 없음

  18. 18

    AWS Python Lambda가 EFS 파일에 액세스 할 수 없음

  19. 19

    루트 사용자가 MySql에 액세스 할 수 없음

  20. 20

    unionfs-fuse가있는 chroot, / dev / *에 액세스 할 수 없음

  21. 21

    VirtualBox 가상 머신에 갑자기 액세스 할 수 없음

  22. 22

    AD 사용자가 Samba Share에 액세스 할 수 없음

  23. 23

    PostgreSQL에 액세스 할 수 없음

  24. 24

    웹에 액세스 할 수 없음

  25. 25

    Hashmap에 액세스 할 수 없음

  26. 26

    사용자가 액세스 할 수없는 데이터베이스에서 데이터 가져 오기

  27. 27

    Azure Virtual Machine-MySQL 데이터베이스에 액세스 할 수 없음

  28. 28

    설치시 SQLite 데이터베이스에 액세스 할 수 없음

  29. 29

    npm 설치가 폴더에 액세스 할 수 없음 (권한 없음)

뜨겁다태그

보관