안드로이드 개발 질문/답변
(글 수 45,052)
쓰레드를 사용하여 이미지를 연속적으로 받아오는데 2개를 동시에 받다가 4개를 받게 하면 에러가 나네요
처음에 4개를 동시에 보여주다가 2개를 보여주게하면 에러는 안나는데
2개에서 4개는 에러가 바로 나네요
6개 이미지 보여주는것도 6->4->2 는 잘되는데 2->4->6은 안되네요
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mQuit=false;
Intent intent = getIntent();
str = intent.getStringExtra("TextIn"); //주소를 받아온다
if(multi == 2){ // 두개의 영상을 받아올시 레이아웃과 이미지뷰, 주소를 셋팅해준다
setContentView(R.layout.multi2);
imgView1 = (ImageView) findViewById(R.id.imgview1);
imgView2 = (ImageView) findViewById(R.id.imgview2);
imgView1.setOnClickListener(clk);
imgView2.setOnClickListener(clk);
imagePath1 = "http://"+str+":8080/cam_1.jpg";
imagePath2 = "http://"+str+":8080/cam_2.jpg";
}
else if(multi == 4){ // 네개의 영상을 받아올시 레이아웃과 이미지뷰, 주소를 셋팅해준다
setContentView(R.layout.multi4);
imgView1 = (ImageView) findViewById(R.id.imgview1);
imgView2 = (ImageView) findViewById(R.id.imgview2);
imgView3 = (ImageView) findViewById(R.id.imgview3);
imgView4 = (ImageView) findViewById(R.id.imgview4);
imgView1.setOnClickListener(clk);
imgView2.setOnClickListener(clk);
imgView3.setOnClickListener(clk);
imgView4.setOnClickListener(clk);
imagePath1 = "http://"+str+":8080/cam_1.jpg";
imagePath2 = "http://"+str+":8080/cam_2.jpg";
imagePath3 = "http://"+str+":8080/cam_3.jpg";
imagePath4 = "http://"+str+":8080/cam_4.jpg";
}
else if(multi == 6){ // 여섯개의 영상을 받아올시 레이아웃과 이미지뷰, 주소를 셋팅해준다
setContentView(R.layout.multi6);
imgView1 = (ImageView) findViewById(R.id.imgview1);
imgView2 = (ImageView) findViewById(R.id.imgview2);
imgView3 = (ImageView) findViewById(R.id.imgview3);
imgView4 = (ImageView) findViewById(R.id.imgview4);
imgView5 = (ImageView) findViewById(R.id.imgview5);
imgView6 = (ImageView) findViewById(R.id.imgview6);
imgView1.setOnClickListener(clk);
imgView2.setOnClickListener(clk);
imgView3.setOnClickListener(clk);
imgView4.setOnClickListener(clk);
imgView5.setOnClickListener(clk);
imgView6.setOnClickListener(clk);
imagePath1 = "http://"+str+":8080/cam_1.jpg";
imagePath2 = "http://"+str+":8080/cam_2.jpg";
imagePath3 = "http://"+str+":8080/cam_3.jpg";
imagePath4 = "http://"+str+":8080/cam_4.jpg";
imagePath5 = "http://"+str+":8080/cam_5.jpg";
imagePath6 = "http://"+str+":8080/cam_6.jpg";
}
//wifistate(); // 네트워크 상태 확인
LoadImageThread LoadImageMain = new LoadImageThread(); //스레드를 생성
LoadImageMain.start(); // 영상을 받아오는 스레드를 실행한다
}
@Override
public boolean onCreateOptionsMenu(Menu menu) { // 2개,4개,6개의 화면 보여주기를 선택할수 있는 옵션메뉴
super.onCreateOptionsMenu(menu);
SubMenu etc = menu.addSubMenu("화면 분할");
etc.setIcon(R.drawable.icon);
etc.add(0,1,0,"2 x 1");
etc.add(0,2,0,"2 x 2");
etc.add(0,3,0,"2 x 3");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent intent = new Intent(CopyOfMultiView.this, CopyOfMultiView.class);
switch (item.getItemId()) {
case 1:
multi = 2; // 2개의 영상을 동시에 받아오게한다. 현재 액티비티를 새로 불러오고 지금 액티비티를 종료 시킨다.
Toast.makeText(this,"2 x 1",Toast.LENGTH_SHORT).show();
intent.putExtra("TextIn", str);
startActivity(intent);
finish();
return true;
case 2: // 4개의 영상을 동시에 받아오게한다. 현재 액티비티를 새로 불러오고 지금 액티비티를 종료 시킨다.
multi = 4;
Toast.makeText(this,"2 x 2",Toast.LENGTH_SHORT).show();
intent.putExtra("TextIn", str);
startActivity(intent);
finish();
return true;
case 3: // 6개의 영상을 동시에 받아오게한다. 현재 액티비티를 새로 불러오고 지금 액티비티를 종료 시킨다.
multi = 6;
Toast.makeText(this,"2 x 3",Toast.LENGTH_SHORT).show();
intent.putExtra("TextIn", str);
startActivity(intent);
finish();
return true;
}
return false;
}
// 네트워크 상태 알림 및 상태별 데이터 전송 속도//
public void wifistate() {
manager = (ConnectivityManager) CopyOfMultiView.this.getSystemService(Context.CONNECTIVITY_SERVICE);
mobile = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (!mobile.isConnected() && !wifi.isConnected()) {
finish();
} else if (mobile.isConnected()) {
sleepspeed = 1500;
} else if (wifi.isConnected()) {
sleepspeed = 700;
}
}
class LoadImageThread extends Thread { //이미지를 연속적으로 계속 불러오는 스레드
public void run() {
while (!loop) {
handler.sendEmptyMessage(multi);
try {
Thread.sleep(sleepspeed);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
loop=false;
e.printStackTrace();
}
if (mQuit) {
break;
}
}
}
}
Handler handler = new Handler() { //이미지를 받아오는 LoadImage를 실행하게 하는 핸들러
@Override
public void handleMessage(Message msg) {
if(multi==2){ // 2개 영상보여주기를 선택했을때 영상을 받아오는 LoadImage를 두개 사용
LoadImage(imagePath1, imgView1);
LoadImage(imagePath2, imgView2);
}
else if(multi==4){// 4개 영상보여주기를 선택했을때 영상을 받아오는 LoadImage를 두개 사용
LoadImage(imagePath1, imgView1);
LoadImage(imagePath2, imgView2);
LoadImage(imagePath3, imgView3);
LoadImage(imagePath4, imgView4);
}
else if(multi==6){// 6개 영상보여주기를 선택했을때 영상을 받아오는 LoadImage를 두개 사용
LoadImage(imagePath1, imgView1);
LoadImage(imagePath2, imgView2);
LoadImage(imagePath3, imgView3);
LoadImage(imagePath4, imgView4);
LoadImage(imagePath5, imgView5);
LoadImage(imagePath6, imgView6);
}
super.handleMessage(msg);
}
};
public void LoadImage(String $imagePath, ImageView ImageView) { //주소와 이미지뷰를 인수로 받아 이미지를 받아온다
// TODO Auto-generated method stub //받아온 이미지를 이미지뷰에 비티맵으로 변환하여 셋팅
InputStream inputStream = OpenHttpConnection($imagePath); //스트림연결을 통하여 이미지를 받아온다
Bitmap bm = BitmapFactory.decodeStream(inputStream);
ImageView.setImageBitmap(bm);
}




비트맵은 메모리를 잘 관리해야 에러가 안 났습니다. 휴 님 블로그에 그런 글이 있었던 것 같네요.
logcat 보셔서 어떤 메세지를 남기기 죽는지 확인하시면 도움이 될 것입니다.