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

ImageView를 스레드에서 좌표배치시 펑펑터집니다

0 추천
package com.example.dfsfsdfsdfsdf;


import android.os.Bundle;
import android.os.Handler;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

@SuppressLint("NewApi")
public class MainActivity extends Activity 
{
 ImageView img;
 float x ,y;
 
 protected void onCreate(Bundle savedInstanceState) 
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  img=(ImageView)findViewById(R.id.imageView1);
  x= img.getX();y=50;
  
  final Thread thread1=new streamThread();
   thread1.start();
   
  img.setOnClickListener(new OnClickListener()
  {
   public void onClick(View v) 
   {
    img.setVisibility(8);  
   }
  });  
 }
 class streamThread extends Thread
 {
  public void run()
  {
   while (y < 800) 
   {       
    try 
    {   
     img.setY(img.getY()+1);    //오류부분
     Thread.sleep(100);    
    }
    catch (InterruptedException e)
    {
     Log.e("JAVATHREAD", "Exception in Thread yo", e);    
    }
   }
  }
 }
 protected void onResume()
 {
  super.onResume();
  
 }
 
 /*
 public void onStart()
 {
  super.onStart();
  Thread thread1=new Thread(new Runnable()
  {
   public void run()
   {
    try
    {   
     Thread.sleep(1000);
     handler.post(runnable);
     
    }
    catch(Exception e)
    {
     Log.e(e.toString(), e.toString());
     }
    // TODO Auto-generated method stub
    
   }
  });
  thread1.start();
 }
 public class ProgressRunnable implements Runnable
 {
  public void run() 
  {
   while(y<700)
   {
   img.setY(y);
   y+=2;
   }
  }
 }*/
 
 

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

}

0.1초마다 ImageView를 1씩 내려주는 소스인데

img.setY(img.getY()+1); 이부분 읽을때마다 터져버리네요

세시간동안 헛짓거리만 했는데.

답이 안나옵니다

ㅜ_ㅜ

익명사용자 님이 2014년 1월 21일 질문

1개의 답변

0 추천

로그캣에 보시면 CalledFromWrongThreadException: Only the original thread that created a view hieryarchy can touch its views라고 오류가 표시됩니다.

 

이미지뷰는 메인 쓰레드(UI 쓰레드라고도 부름)에서 생성했으니까 메인 쓰레드에서 이동 등의 처리를 해야 합니다. 다른 쓰레드(위에서 StreamThread)에서 ui를 처리해서 생긴 오류입니다. 다른 쓰레드에서 UI를 처리해야 할 때에는 runOnUiThread 메소드를 사용해야 합니다.

 

try {
 
runOnUiThread(new Runnable() {
public void run() {
imageView.setY(imageView.getY() + 1);
}
});
 
Thread.sleep(100);
} catch (InterruptedException e) {
Log.e("MainActivity", "error: " + e.getMessage());
}
 
 
그리고 클래스명은 대문자로 시작해요. streamThread가 아니라 StreamThread로 사용하셔야 합니다.
방귀과장 (18,940 포인트) 님이 2014년 1월 22일 답변
아 정말감사합니다 몇시간 골머리 싸맷는데 ㅜㅜ
정말 감사합니다
아 정말감사합니다 몇시간 골머리 싸맷는데 ㅜㅜ
 정말 감사합니다...
ㅜ_ㅜ
...