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

로딩 화면을 띄여두고 XML 파싱을 진행 시키고 싶습니다

0 추천

그런데 XML 파싱 화면이 뜨고 로딩 화면이 그 다음에 뜹니다

 

혹시 코드상에서 잘못된 것이 있는지 봐주시면 감사하겠습니다

 

< 메인 엑티비티 >

public class MainActivity extends TabActivity
{
	public TabHost tabHost;
	public TabHost.TabSpec spec;
	public Intent intent;
	public Resources res;

	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		startActivity(new Intent(this, SplashActivity.class));

		res = getResources();
		tabHost = getTabHost();

		tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("뉴스").setContent(new Intent(this, NewsActivity.class)));

		tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("달력").setContent(new Intent(this, CalendarActivity.class)));

		setTitle("NSecurity");
	}
}

< xml 파싱 엑티비티 >

public class NewsActivity extends ListActivity implements OnItemClickListener
{
	ArrayAdapter<NewsList> arrAdapter;
	final ArrayList<NewsList> newsList = new ArrayList<NewsList>();
	final ArrayList<NewsList> sort_newsList = new ArrayList<NewsList>();

	Vector<String> titlevec = new Vector<String>();
	Vector<String> linkevec = new Vector<String>();
	Vector<String> authorevec = new Vector<String>();
	Vector<String> timeevec = new Vector<String>();

	NewsContent newscontent = new NewsContent();
	
	private static final Comparator<NewsList> myComparator = new Comparator<NewsList>()
	{

		private final Collator collator = Collator.getInstance();

		@Override
		public int compare(NewsList object1, NewsList object2)
		{
			return collator.compare(object1.getTime(), object2.getTime());

		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		newscontent.execute(null, null, null);
		
		while (true)
		{
			try
			{
				Thread.sleep(5000);
				if (newscontent.flag == true)
				{
					titlevec = newscontent.titlevec;
					linkevec = newscontent.linkevec;
					authorevec = newscontent.authorevec;
					timeevec = newscontent.timeevec;

					break;
				}
			}
			catch (Exception e)
			{
			}
		}

		for (int i = 0; i < titlevec.size(); i++)
		{
			newsList.add(new NewsList(titlevec.get(i), authorevec.get(i), timeevec.get(i), linkevec.get(i)));
		}
		for (int i = 0; i < newsList.size(); i++)
		{
			sort_newsList.add(newsList.get(i));
		}

		Collections.sort(sort_newsList, myComparator);
		Collections.reverse(sort_newsList);

		arrAdapter = new NewsArrayAdpter(this, R.layout.news_list, R.id.news_title, sort_newsList);
		// arrAdapter.sort();
		setListAdapter(arrAdapter);

		ListView lv = getListView();
		lv.setOnItemClickListener(this);

	}

	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
	{
		String content = sort_newsList.get(arg2).getLink();
		Intent intent = new Intent(getBaseContext(), Content.class);
		intent.putExtra("content", content);
		startActivity(intent);
	}

	private class NewsArrayAdpter extends ArrayAdapter<NewsList>
	{
		private ArrayList<NewsList> newsList;
		private int rsrc;

		public NewsArrayAdpter(Context ctx, int rsrcId, int txtId, ArrayList<NewsList> list)
		{
			super(ctx, rsrcId, txtId, list);
			// TODO 자동 생성된 생성자 스텁
			this.newsList = list;
			this.rsrc = rsrcId;
		}

		public View getView(int position, View convertView, ViewGroup parent)
		{
			View v = convertView;
			if (v == null)
			{
				LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
				v = li.inflate(rsrc, null);
			}
			NewsList e = newsList.get(position);
			if (e != null)
			{
				((TextView) v.findViewById(R.id.news_title)).setText(e.getTitle().toString());
				((TextView) v.findViewById(R.id.news_author)).setText(e.getAuthor().toString());
				((TextView) v.findViewById(R.id.news_time)).setText(e.getTime().toString());
			}
			return v;
		}
	}
	
	private class NewsContent extends AsyncTask<Void, Void, Void>
	{
		Vector<String> titlevec = new Vector<String>();
		Vector<String> linkevec = new Vector<String>();
		Vector<String> authorevec = new Vector<String>();
		Vector<String> timeevec = new Vector<String>();
		Vector<String> newsList = new Vector<String>();
		
		private ProgressDialog pDialog;
		// 웹사이트에 연결하기위해서 url 클래스를 적용
		URL url;

		String tagname = "", title = "", link = "";
		String time = "", author = "";
		boolean flag = false;

		@Override
		protected Void doInBackground(Void... params)
		{
			try
			{
				XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
				factory.setNamespaceAware(true);
				XmlPullParser xpp = factory.newPullParser();

				boolean isInItemTag = false;
				int eventType = 0;
				InputStream in = null;

				newsListAdd();

				for (int i = 0; i < newsList.size(); i++)
				{
					url = new URL(newsList.get(i));

					in = url.openStream();

					xpp.setInput(in, "UTF-8"); // xml문서의 인코딩 정확히 지정

					isInItemTag = false;

					eventType = xpp.getEventType();

					while (eventType != XmlPullParser.END_DOCUMENT)
					{

						if (eventType == XmlPullParser.START_TAG)
						{
							// 태그명을 읽어드림
							tagname = xpp.getName();

							if (tagname.equals("item"))
							{
								isInItemTag = true;
							}

						}
						else if (eventType == XmlPullParser.TEXT)
						{
							if (tagname.equals("title") && isInItemTag)
							{
								title += xpp.getText();
							}
							else if (tagname.equals("author") && isInItemTag)
							{
								author += xpp.getText();
							}
							else if (tagname.equals("pubDate") && isInItemTag)
							{
								time += xpp.getText();
							}
							else if (tagname.equals("link") && isInItemTag)
							{
								link += xpp.getText();
							}
						}
						else if (eventType == XmlPullParser.END_TAG)
						{
							tagname = xpp.getName();

							if (tagname.equals("item"))
							{
								SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
								Date date = new Date(time);
								time = sdf.format(date);


								titlevec.add(title);
								linkevec.add(link);
								authorevec.add(author);
								timeevec.add(time);

								title = "";
								link = "";
								author = "";
								time = "";
								isInItemTag = true;
							}
						}
						eventType = xpp.next();
					}
					flag = true; // true : 지정된 xml파일을 읽고 필요한 데이터를
				}
			}
			catch (Exception e)
			{
			}
			return null;
		}
	}
}

< 로딩 화면 엑티비티 >

public class SplashActivity extends Activity
{
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.splash);
		
		Handler handler = new Handler()
		{
			public void handleMessage(Message msg)
			{
				finish();
			}
		};
		handler.sendEmptyMessageAtTime(0, 5000);
	}
}

 

츄몽 (210 포인트) 님이 2013년 8월 19일 질문

1개의 답변

+1 추천
로딩화면을 별도의 activity로 가져가시는 것보단

파싱하는 activity 내에서 로딩화면을 출력해주는 방법을 생각해 보시면 좋을거 같네요.

그리고 파싱 activity에서 oncreate에 sleep을 사용하시는 것보단 asynctask의 postexcuted 메소드를 이용하시는게 나은 방법으로 보입니다.

로딩화면은 출력은 popupwindow나 다른 방법을 사용하면 될거 같고요.
whitesnow (8,920 포인트) 님이 2013년 8월 29일 답변
...