한 클래스에서 데이터를 가져 와서 싱글 톤에 넣은 다음 다른 클래스에서 해당 데이터에 액세스하려고합니다.
내 싱글 톤은 다음과 같습니다.
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
열심히 만들어집니다 시작 (초기화) 시간과 때 호출시 setTransients
와 getTransients
같은 것을 instance
(싱글)이 사용됩니다. 열성적인 창작 대신 instance
게으른 창작이 필요한 경우 여기 를 볼 수 있습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다