인프런 커뮤니티 질문&답변

박정훈님의 프로필 이미지

작성한 질문수

윤재성의 Java 기반 Android 9.0(pie) App 개발 고급 3단계

34강 서버로 부터 데이터 가져오기

쓰레드 질문 입니다.

해결된 질문

20.01.30 14:36 작성

·

230

0

안녕하세요

메인화면에 여러개의 프래그먼트를 배치시켜서 작업중입니다.

프래그먼트 구성은 리스트 뷰 입니다. 리스트 내용은 이미지와 텍스트 인데요

서버에서 그 내용을 받거나 다시 서버로 업로드 시키면서 화면을 유지 시키려고 합니다.

일단 메인클레스에 각 프래그먼트에서 사용할

해쉬맵과 어레이 리스트 객체를 만들어두고

각 프래그먼트에서 호출해서 사용하고 있습니다.

그러다보니

메인클레스에는 변수와 리스트 객체가 위치하게되고 

프래그먼트 클레스에는 어뎁터를 커스터마이징 하는 코드가 위치하게 되었습니다.

여기서 질문입니다.

0. 어뎁터를 메인클레스에만 위치시키고 프래그먼트에서  어뎁터를 갖고와서 사용하는 방법은 할 수 없나요?

     (만약 이게 된다면 쓰레드 문제도 해결 될것 같은데요..)

1. 데이터를 주고 받는 쓰레드는 메인 클레스와 프래그먼트 클레스중 어디에 위치 시켜야 하나요?

(메인클레스에 넣어봤는데 안되네요

프래그먼트 클레스에 넣으니 잘 작동은 하긴하는데 이렇게되면 프래그먼트마다 쓰레드를 계속 만들어줘야  할 것 같습니다..)

- 메인클레스에 데이터를 업로드 다운로드 하는 쓰레드를 넣었을경우 질문

2.  혹시 runOnUi를  사용할 수 있는 방법이 있나요?? 

      쓰레드 클레스는 static 으로 만들어야되네요..

       프래그먼트 클레스에서 사용해야 하므로...

       그러면 서브 쓰레드에서 runOnUi 사용못하게 되던데

       해결방법이 있을까요?

3.  프래그먼트에 있는 어뎁터를 쓰레드 없이 갱신할 수 있

      는 방법이 있을까요?

        runOnUi를 못쓰니 어뎁터 갱신을 할수 없었습니다.   

        리스트 객체에 값만 넣어주는 작업까지만 하고

        쓰레드가 끝나던데 해결방법이 있을까요?

4. resume 매써드는 메인클레스 외에 화면에서는 작동

         안하는 메서드 인가요?

리스트프래그먼트에서 리스트에 어뎁터 달아주는 코드 바로 위에 어뎁터에서 갱신 해주는 코드를 넣어봤지만 작동 안하네요.

   resume 매써드 이용해도 마찬가지였어요.

-프래그먼트 클레스에 데이터 업로드, 다운로드 하는 쓰레드를 만들었을때 질문입니다.

5. getactivity 함수 이용하니까 runOnUi 도 사용할 수

    있고, 어뎁터 갱신도 할 수 있고 그래서 그런지 잘 작동 합니다. 그런데 프래그먼트마다 일일히

    쓰레드 만들어 줘야만 하나요?  쓰레드가 많이 있으면 앱이 느려질것 같아서 걱정이 됩니다.

    혹시 선생님은 쓰레드를 줄이기 위해서 어떤 방법을 많이 사용하시나요?

항상 질문에 답변 잘 해주셔서 감사드립니다. 덕분에 많이 도움이 되었습니다.

잘 모르다 보니 이상하고 난감한 질문을 많이 드린것 같습니다.

대략적인 방향만이라도 알려주시면 감사하겠습니다. 

답변 4

0

박정훈님의 프로필 이미지
박정훈
질문자

2020. 01. 31. 11:24

1시간 걸렸네요. 

리스트 어뎁터를 클레스 객체화 해서  사용할수 있게 만들었습니다~~

1. getLayoutinflater 이거는 혼자 못쓰니까 context를 받아와서 (LayoutInflater)context.GetSystemService(context.Layout_Inflater_Service);이걸로 대체했고.

2. 리스트도 별도로 받아오게 했습니다.

하면서 많이 배웁니다. 감사합니다. 

앞으로 이런식으로 클레스 만드는 연습을 많이 해봐야겠어요.

package com.first.bestseller;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.HashMap;
import java.util.List;

public class listadapterclass extends BaseAdapter {
Context context;
List listc;
public listadapterclass(List listc,Context context){
this.listc = listc;
this.context = context;
}

@Override
public int getCount() {
return listc.size();
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {


LayoutInflater inflater = (LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

convertView = inflater.inflate(R.layout.listcostom, null);

ImageView limg = convertView.findViewById(R.id.limg);
TextView date = convertView.findViewById(R.id.date);
TextView color = convertView.findViewById(R.id.color);
TextView size = convertView.findViewById(R.id.size);
TextView price = convertView.findViewById(R.id.price);
TextView cate = convertView.findViewById(R.id.cate);
TextView name = convertView.findViewById(R.id.name);
TextView lo = convertView.findViewById(R.id.lo);


HashMap<String, Object> map = (HashMap<String, Object>) listc.get(position);

int img = (int) map.get("limg");

limg.setImageResource(img);
date.setText(map.get("date").toString());
color.setText(map.get("color").toString());
size.setText(map.get("size").toString());
price.setText(map.get("price").toString());
cate.setText(map.get("cate").toString());
name.setText(map.get("name").toString());


return convertView;
}
}

0

박정훈님의 프로필 이미지
박정훈
질문자

2020. 01. 31. 09:52

아하 이해했습니다 감사합니다.!

0

nury님의 프로필 이미지
nury
지식공유자

2020. 01. 31. 08:40

다른 액티비티에서 사용하고 싶다면 액티비티 실행시킬때 인텐트에 담아 넘겨주세요.  그리고 어뎁터를 돌려쓰지 마시고 액티비티 마다 어뎁터를 생성해서 사용하시길 바랍니다. 클래스는 같은걸 쓰시고 따로 따로 객체 생성해서 사용해주세요.

0

박정훈님의 프로필 이미지
박정훈
질문자

2020. 01. 30. 21:50

어뎁터를 매인클레스에서 만들었습니다.

프래그먼트에서 getactivity 함수 이용하니까 구지 메인에 있는 어뎁터를 ststic로 안바꿔도 가져와 지네요.

그래서..

추가 질문 입니다. 혹시 다른 엑티비티에서도 어뎁터나 변수를 돌려쓸수 있을까요. static로 안바꾸고요... 엑티비티에서는 getactivity 가 안되네요. ㅠㅠ