블로그 이미지
App 개발에 대한 내용을 다룰 예정입니다. AppleSherbet

카테고리

분류 전체보기 (39)
한국프로야구 어플 (18)
세미나 (2)
Java Development (13)
Android App소개 (3)
기타 (2)
당근마켓 (1)
Total300,512
Today1
Yesterday12
안드로이드 어플을 해보면 대부분의 어플이 3G혹은 WIFI망을 통해 데이터 통신을 하게된다. 현재 개발중인 앱또한 마찬가지여서 네트워크를 쓰는 엑티비티가 생성되기 전에 망 사용 가능 여부를 체크하는 코드를 삽입하였다.
다른 사이트에서 참고를 했었는데 어디였는지 기억이 안난다..;;

기본적으로 플랫폼에서 모든 API를 편하게 제공하기때문에 쉽게 구현할 수 있다.

1.ConnectivityManager m_NetConnectMgr= (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
- 위의 코드는 시스템으로 부터 서비스를 가져온다.

2. NetworkInfo info = m_NetConnectMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
- 가져온 서비스를 이용해 WIFI 관련 정보를 가져온다.

3. info.isAvailable() / info.isConnected()
- 위와 같은 메소드를 이용해 현재 망 상태를 점검한다.

이상의 3가지 정도가 기본이 된다.

소스코드


다음은 Network 정보를 체크하는 코드로 static으로 만들었다.
public class KBONetworkInfo {

	public static boolean IsWifiAvailable(Context context)
	{
		ConnectivityManager m_NetConnectMgr= (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
		boolean bConnect = false;
		try
		{
			if( m_NetConnectMgr == null ) return false;

			NetworkInfo info = m_NetConnectMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
			bConnect = (info.isAvailable() && info.isConnected());

		}
		catch(Exception e)
		{
			return false;
		}

		return bConnect;
	}

	public static boolean Is3GAvailable(Context context)
	{  
		ConnectivityManager m_NetConnectMgr= (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
		boolean bConnect = false;
		try
		{
			if( m_NetConnectMgr == null ) return false;
			NetworkInfo info = m_NetConnectMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
			bConnect = (info.isAvailable() && info.isConnected());
		}
		catch(Exception e)
		{
			return false;
		}

		return bConnect;
	}
}
엑티비티의 onCreate 안에서 간단히 체크해준다.
  
if (!KBONetworkInfo.IsWifiAvailable(this) && !KBONetworkInfo.Is3GAvailable(this))
{
	Toast.makeText(this, "네크워크에 연결할 수 없습니다.", Toast.LENGTH_LONG).show();
	return;
}

마지막으로 네트워크 상태를 접근하기 위한 권한을 추가해 주어야 한다.
  
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
신고
Posted by AppleSherbet
안드로이드 개발을 하다보니 네트워크를 이용하여 데이터를 받아오는 코드가 많아졌다.
Wifi가 연결되어 있을땐 속도가 빨라서 괜찮은데 3G망...
특히 지하철 같은곳에서 테스트를 해보니 상당히 느려서 유저는 어플이 죽은거라고
생각 할 수도 있다.

그래서 ProgressBar를 구현하게 되었다.

ProgressBar구현은 간단하다..
추가적인 쓰레드를 만들어서 ProgressBar를 돌리는 동시에 네트워크로 부터 데이터를 받아오면 된다.
데이터를 모두 받아오면 ProgressBar를 종료시키고 받아온 데이터를 이용해 View를 갱신한다.

     //프로그래스 바 시작
        loagindDialog = ProgressDialog.show(this, "로딩중",
                "Loding...please wait", true, false);
        //쓰레드 시작: 네트워크로 부터 데이터 받아옴
        thread = new Thread(new Runnable() {
            public void run(){
                try {
                    source = new Source(new URL("http://sports.media.daum.net/baseball/kbo/record/main.daum"));
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                source.fullSequentialParse();
                avgList = getRecordArr(source, REC_TYPE_AVG);
                hitList = getRecordArr(source, REC_TYPE_HIT);
                hrList = getRecordArr(source, REC_TYPE_HR);
                rbiList = getRecordArr(source, REC_TYPE_RBI);
                eraList = getRecordArr(source, REC_TYPE_ERA);
                soList = getRecordArr(source, REC_TYPE_SO);
                svList = getRecordArr(source, REC_TYPE_SV);
                wList = getRecordArr(source, REC_TYPE_W);
    //핸들러에게 종료 메세지를 보내줌
                handler.sendEmptyMessage(0);
            }
        });
        thread.start();
 
     // 핸들러는 프로그래스 바를 종료하고 데이터를 View에 채운다.
     private Handler handler = new Handler() {
            public void handleMessage(Message msg) {
                loagindDialog.dismiss();
                //받아온 데이터를 이용해 뷰 갱신.
                fillRecordData("타자(타율)", avgList);
                fillRecordData("타자(타점)", hitList);
                fillRecordData("타자(홈런)", hrList);
                fillRecordData("타자(안타)", rbiList);
               
                TextView tv = new TextView(RecordAct.this);
                tv.setText("투수 부분");
                tv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 35));
                tv.setBackgroundDrawable(RecordAct.this.getResources().getDrawable(R.drawable.title_shape));
                tv.setTextSize(15.0f);
                tv.setTextColor(Color.BLACK);
                tv.setGravity(Gravity.CENTER);
               
                TableLayout tl = (TableLayout)findViewById(R.id.record_table);
                tl.addView(tv);
               
                fillRecordData("투수(방어율)", eraList);
                fillRecordData("투수(탈삼진)", soList);
                fillRecordData("투수(세이브)", svList);
                fillRecordData("투수(다승)", wList);
            }
        };
신고
Posted by AppleSherbet
-- 발췌 (http://jkproject.net/5)

지난번에 만들었던 갤러리 앱의 경우 res/drawable 디렉토리에 사용하는 모든 이미지를 넣어두었는데 이러다보니 앱 자체의 사이즈가 너무 커지는 단점이 있다. 그래서 외부 웹에서 이미지를 가져오도록 수정하였다.

우선 앱에서 인터넷에 접속할 수 있는 권한을 AndroidManifest.xml 에 주어야 한다. 아래와 같이 uses-permission을 사용하여 INTERNET 권한을 주면 된다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.example.hellogallery"
 android:versionCode="1"
 android:versionName="1.0">
<uses-permission android:name="android.permission.INTERNET" />
<application android:icon="@drawable/icon" android:label="@string/app_name">

다음으로는 ImageAdapter class에서 사용했던 mImageIds 대신에 mRemoteImages를 다음과 같이 만든다. 여기엔 web상에 있는 이미지의 주소를 나열해주면 된다
private String[] mRemoteImages = {   
"http://www.examples.com/a.jpg", "http://www.examples.com/b.jpg", "http://www.examples.com/c.jpg", "http://www.examples.com/d.jpg", "http://www.examples.com/e.jpg" };

그 후엔 mImageIds를 사용하던 부분을 mRemoteImages를 사용해 구현하면 된다.
i.setImageResource(mImageIds[position]);
위의 것을 다음과 같이 수정한다.
try {
  URL aURL = new URL(mRemoteImages[position]);
  URLConnection conn = aURL.openConnection();
  conn.connect();
  InputStream is = conn.getInputStream();
  BufferedInputStream bis = new BufferedInputStream(is);
  Bitmap bm = BitmapFactory.decodeStream(bis);
  bis.close();
  is.close();
  i.setImageBitmap(bm);
} catch (IOException e) {
  i.setImageResource(R.drawable.file_not_found);
  Log.e("DEBUGTAG", "Remote Image Exception", e);
}

R.drawable.file_not_found 는 혹시 웹에서 이미지를 불러오지 못할 경우 화면에 띄워줄 수 있는 이미지를 res/drawable에 넣어주면 되겠다.

여기서 더 추가해볼 만한 것은 웹상의 xml파일을 읽어들여 어플에서 사용할 이미지에 대한 정보 및 이미지를 가져오는 것이다. 이렇게 되면 어플을 수정할 필요없이 웹상의 xml파일을 수정하는 것만으로 앱 내의 이미지 업데이트가 가능해지므로 좀더 유연한 어플이 될 수 있다.

참고한 사이트는 다음과 같다.
http://developer.android.com/guide/topics/security/security.html
http://www.anddev.org/gallery_with_remote_images-t769.htm
신고
Posted by AppleSherbet

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

티스토리 툴바