마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

data랑 dates: List<String>이 맞지 않습니다

0 추천
public class Calendar2 extends AppCompatActivity {
    private final OneDayDecorator oneDayDecorator = new OneDayDecorator();
    MaterialCalendarView materialCalendarView;
    static final int REQ_ADD_CONTACT=1;
    String data;

    private FirebaseFirestore db;


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

    <생략>
     db = FirebaseFirestore.getInstance();
        String dgKey = FirebaseAuth.getInstance().getCurrentUser().getUid()+"000";
        db.collection("DiaryGroupList").document(dgKey)
                .collection("diaryList").get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            for (QueryDocumentSnapshot document : task.getResult()) {
                                //Toast.makeText(Calendar2.this,document.getData().get("date").toString(),Toast.LENGTH_LONG).show();
                                data=document.getData().get("date").toString();
                                TextView textViewNo = (TextView) findViewById(R.id.textViewNo);
                                textViewNo.setText(data);

                            }
                            if (data.size>0){     
                                executeApiSumlator(data);
                            }
                        }
                    }
                });
    }
    private void executeApiSumlator(dates: List<String>) {
        ApiSimulator ApiSimulator = new ApiSimulator(dates);
        ApiSimulator.execute();
    }

    class ApiSimulator extends AsyncTask<Void, Void, List<CalendarDay>> {


        @Override
        protected List<CalendarDay> doInBackground(@NonNull Void... voids) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            Calendar calendar = Calendar.getInstance();
            ArrayList<CalendarDay> dates = new ArrayList<>();
            /*특정날짜 달력에 점표시해주는곳*/
            /*월은 0이 1월 년,일은 그대로*/
            //string 문자열인 Time_Result 을 받아와서 ,를 기준으로짜르고 string을 int 로 변환

            //calendar.set(year, month - 1, dayy);
            CalendarDay day = CalendarDay.from(calendar);

            Intent intent = getIntent();
            String date = intent.getStringExtra("date");
            Toast.makeText(Calendar2.this,date,Toast.LENGTH_LONG).show();

            // date를 받아와서 20201129이면
            // 2020을 int year로 저장
            // 11을 int month로 저장
            // 29를 int dayy로 저장 시켜야함 -> 현재 date 자체가 안받아와짐
            dates.add(day);
            return dates;
        }

        @Override
        protected void onPostExecute(@NonNull List<CalendarDay> calendarDays) {
            super.onPostExecute(calendarDays);
            if (isFinishing()) {
                return;
            }
            materialCalendarView.addDecorator(new EventDecorator(Color.RED, calendarDays, Calendar2.this));
        }
    }
}

적어주신 data.size부분에서 오류가 떠서 data.length()로 바꾸면 괜찮은데 
private void executeApiSumlator(dates: List<String>) {
    ApiSimulator ApiSimulator = new ApiSimulator(dates);
    ApiSimulator.execute();
}
이부분이 문제가 생깁니다.
if (data.size>0){
    executeApiSumlator(data);
}
여기서 data와 안맞는다고 계속 오류가 나네요....
이야이야 (160 포인트) 님이 2020년 11월 30일 질문

1개의 답변

0 추천

ApiSimulator에 필요한 데이터 뭔지 다시 살펴보세요.


class ApiSimulator extends AsyncTask<Void, Void, List<CalendarDay>> {

       private final List<String> dateStrings;
     
       public ApiSimulator(List<String> dateStrings) {
           this.dateStrings - dateStrings;
      }

        @Override
        protected List<CalendarDay> doInBackground(@NonNull Void... voids) {
            // Thread.sleep은 사용하시면 안됩니다. UI를 블락킹하게 됩니다. 그리고 여기서는 굳이 딜레이를 줄 이유가 없어보이네. 그냥 지우세요.
 
            Calendar calendar = Calendar.getInstance();
            ArrayList<CalendarDay> dates = new ArrayList<>();
            /*특정날짜 달력에 점표시해주는곳*/
            /*월은 0이 1월 년,일은 그대로*/
            //string 문자열인 Time_Result 을 받아와서 ,를 기준으로짜르고 string을 int 로 변환
            doSomethingWithDateStrings(dateStrings);
 
            //calendar.set(year, month - 1, dayy);
            CalendarDay day = CalendarDay.from(calendar);
 
            Intent intent = getIntent();
            String date = intent.getStringExtra("date");
            Toast.makeText(Calendar2.this,date,Toast.LENGTH_LONG).show();
 
            // date를 받아와서 20201129이면
            // 2020을 int year로 저장
            // 11을 int month로 저장
            // 29를 int dayy로 저장 시켜야함 -> 현재 date 자체가 안받아와짐
            dates.add(day);
            return dates;
        }
 
       // 생략.
    }

그리고 ApiSimulator는 불필요한 클래스로 보입니다. 하시려는 것이 List<String>을 받아서 List<CalendarDay>롤 변환하시는 것이므로 그냥 유틸리티 메소드를 하나 만드셔서 사용하시면 되구요. 이걸 테스트 하시려면 Junit으로 Unit test 해보시면 됩니다. 이런 작업에 AsyncTask까지 쓰는 것은 모기 잡기위해 바위를 내려치는 격입니다. 물론 아주 큰 작업이라면 AsyncTask를 쓰실 수도 있습니다. 비록 권장하지는 않고 싶지만요.

spark (227,970 포인트) 님이 2020년 11월 30일 답변
...