안드로이드 개발 질문/답변
(글 수 45,052)
아이스크림샌드위치 이후 부터는 파싱할때 스레드를 사용하여 파싱을 해야 한다고 하더라구요
그래서 AsyncTask를 이용하여 파싱을 하려고 하는데
메인스레드 oncreate에서 AsyncTask 호출해서 백그라운드에서 파싱이 처리되는데
그 파싱한거의 리턴값을 받기도 전에 메인스레드가 실행되는지.. 에러나고 꼬이더라구요
하나의 AsyncTask가 작업을 완료할때까지 메인쓰레드가 대기하게 할순 없나요 ??
아래는 소스입니다 ㅠㅠ...
public class BlogFlipPage extends Activity {
private FlipViewController flipView;
ProgressDialog dialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new BackBlog().execute("");
flipView = new FlipViewController(this);
flipView.setAdapter(new MyBaseAdapter(this));
setContentView(flipView);
}
@Override
protected void onStart() {
super.onStart();
}
class BackBlog extends AsyncTask<String, Integer, Long> {
@Override
protected void onPreExecute() {
if (!GlobalSetting.isConnect_Toast(BlogFlipPage.this)) {
cancel(true);
}
dialog = ProgressDialog.show(BlogFlipPage.this, "", "로딩중입니다.", true);
}
@Override
protected Long doInBackground(String... params) {
WebAPI api = new WebAPI();
String xml;
String url = "http://blog.rss.naver.com/gnbfriends/";
xml = api.BlogGetXml(url);
Log.d("xml", xml);
GlobalSetting.BlogArr = XmlParser.BlogParser(xml);
GlobalSetting.BlogArr2 = XmlParser.BlogParser2(xml);
Log.d("size", "BlogSize1 : " + String.valueOf(GlobalSetting.BlogArr.size()));
Log.d("size", "BlogSize2 : " + String.valueOf(GlobalSetting.BlogArr2.size()));
if (GlobalSetting.BlogArr.size() == 0) {
finish();
}
return null;
}
@Override
protected void onPostExecute(Long result) {
dialog.dismiss();
super.onPostExecute(result);
}
}
@Override
protected void onResume() {
super.onResume();
flipView.onResume();
}
@Override
protected void onPause() {
super.onPause();
flipView.onPause();
}
private static class MyBaseAdapter extends BaseAdapter {
private static List<Data> IMG_DESCRIPTIONS = new ArrayList<Data>();
static {
for (int i = 0; i < GlobalSetting.BlogArr.size(); i++) {
if (GlobalSetting.BlogArr.size()%2 == 0) {
IMG_DESCRIPTIONS.add(new Data(GlobalSetting.BlogArr.get(i).title, GlobalSetting.BlogArr.get(i).desc,
GlobalSetting.BlogArr.get(i).pubdate,GlobalSetting.BlogArr2.get(0).title,
GlobalSetting.BlogArr.get(i+1).title,GlobalSetting.BlogArr.get(i+1).desc, GlobalSetting.BlogArr.get(i+1).pubdate, GlobalSetting.BlogArr2.get(0).title ));
}
}
private LayoutInflater inflater;
private MyBaseAdapter(Context context) {
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return IMG_DESCRIPTIONS.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View layout = convertView;
if (convertView == null)
layout = inflater.inflate(R.layout.blog_detail, null);
final Data data = IMG_DESCRIPTIONS.get(position);
Button backBtn = (Button)layout.findViewById(R.id.backbtn);
backBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Context context = null;
// Toast.makeText(context, "종료는 어떻게하는거지", 3000).show();
}
});
TextView JjakTitle = (TextView) layout.findViewById(R.id.jjaktitle);
JjakTitle.setText(data.jjakTitle);
TextView JjakContent = (TextView) layout.findViewById(R.id.jjakcontent);
JjakContent.setText(data.jjakContent);
TextView JjakDay = (TextView) layout.findViewById(R.id.jjakday);
JjakDay.setText(data.jjakDay);
TextView JjakWriter = (TextView) layout.findViewById(R.id.jjakwriter);
JjakWriter.setText(data.jjakWriter);
TextView HolTitle = (TextView) layout.findViewById(R.id.holtitle);
HolTitle.setText(data.holTitle);
TextView HolContent = (TextView) layout.findViewById(R.id.holcontent);
HolContent.setText(data.holContent);
TextView HolDay = (TextView) layout.findViewById(R.id.holday);
HolDay.setText(data.holDay);
TextView HolWriter = (TextView) layout.findViewById(R.id.holwriter);
HolWriter.setText(data.holWriter);
return layout;
}
private static class Data {
public String jjakTitle;
public String jjakContent;
public String jjakDay;
public String jjakWriter;
public String holTitle;
public String holContent;
public String holDay;
public String holWriter;
private Data(String ajjakTitle, String ajjakContent, String ajjakDay, String ajjakWriter, String aholTitle, String aholContent, String aholDay, String aholWriter) {
this.jjakTitle = ajjakTitle;
this.jjakContent = ajjakContent;
this.jjakDay = ajjakDay;
this.jjakWriter = ajjakWriter;
this.holTitle = aholTitle;
this.holContent = aholContent;
this.holDay = aholDay;
this.holWriter = aholWriter;
}
}
}
}
아하....
그러니까 파싱한 데이터가 리스트뷰에 들어가야 하는데
파싱이 미처 끝나기도 전에 메인스레드에서 리스트뷰를 표시해버리니까
리스트뷰에 들어가야할 데이터가 null이 되거나 빠져버려서
에러가 나거나 빈리스트로 표현 된다...이건가요?ㅎㅎ