이 문제를 도저히 해결을 못 하겠습니다.
A 액티비티에서 버튼 클릭시 B 액티비티를 호출하고,
B 액티비티는 웹DB에서 select 쿼리를 통해서 텍스트와, 이미지를 가져와서 보여주도록 되어 있습니다.
AsyncTask를 아래와 같이 사용했습니다.
저는 저 이미지 출력부를 AsyncTask 사이에 넣고 프로그래스 다이얼로그를 했기에, 액티비티가 호출된 후
이미지를 받아서 그리는 동안 프로그래스 다이얼로그를 띄우려고 하는데,
이렇게 했을경우, B 액티비티가 호출되고 난 후 한참을 까만 화면이 나오고 그제서야 로딩중이라는
프로그래스 다이얼로그가 호출되면서 페이지가 열립니다.
Handler handler = new Handler();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_detail);
getImageView(); //해당 게시물 이미지 출력
getDataView(); //해당 게시물 텍스트 출력
btnSetup(); //버튼 이벤트 설정
}
public void getImageView() {
new AsyncTask<Void, Void, Void>( ) {
protected void onPreExecute() {
dialog = ProgressDialog.show(this, "","로딩중입니다.", true, true);
};
@Override
protected Void doInBackground(Void... params) {
handler.post(new Runnable( ) {
@Override
public void run() {
loadImg(); //실제 이미지 출력
}
});
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
dialog.dismiss();
}
}.execute();
}
웹에서 이미지 경로를 가져와서 이미지를 보여주는 부분은 아래와 같이 구현했습니다.
public void loadImg() {
Img = (ImageView) findViewById(R.id.detail_img);
Uri uri = Uri.parse(hm.get("detail_img[0]")); //웹 이미지 경로url
try {
if (hmImg.get("detail_img[0]") == null) { //메모리에 출력할 이미지가 없을때만 웹서버에 요청
String urlstr = Image_url + hm.get("detail_img[0]");
URL url = new URL("urlstr);
URLConnection conn = url.openConnection();
conn.connect();
BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
Bitmap bm = BitmapFactory.decodeStream(bis);
bis.close();
Img.setImageBitmap(bm);
}
} catch (Exception e) {
Log.e(TAG, e.toString());
}
로그캣에 로그를 출력해보면,
loadImg() 부분이 너무 오래걸려서 까만 화면이 나오게 되는것 같습니다. 그러니 onResume()자체가 늦게 떠버려서
프로그래스 다이얼로그 자체가 안그려지는 것 아닌가 하는데요...
12-05 23:37:46.055: INFO/DetailView(6770): onCreate()
12-05 23:37:46.070: INFO/DetailView(6770): onPreExecute()
12-05 23:37:46.510: INFO/DetailView(6770): getDataView()
12-05 23:37:46.545: INFO/DetailView(6770): onStart()
12-05 23:37:46.545: INFO/DetailView(6770): onResume() //여기에서
12-05 23:37:49.925: INFO/DetailView(6770): loadImg() //여기가 시간차가 벌어짐
12-05 23:37:49.925: INFO/DetailView(6770): ondoInBackgroud() / loadImg() 호출
12-05 23:37:49.930: INFO/DetailView(6770): onPostExecute()
어떻게 해야 정보를 출력하게 되는 B 액티비티에서 제대로 로딩중 프로그래서 다이얼로그를 띄우면서
텍스트와 이미지 정보를 보여줄 수 있을까요??? 꼭 좀 도와주세요...
AsyncTask 자체를 잘못 사용하셨네요
doInBackground 에서는 원래 UI 쓰레드가 아닌 작업만 수행하는데 이를위해서 핸들러를 사용하셨네요 -_-;
이런 방식은 사실 AsyncTask 보단 그냥 Thread 과 차이 없습니다.
handle.post 는 UI 쓰레드에서 연산을 합니다.
지금 post 자체에서 웹에서 이미지를 긁어 오고 있으니 당연히 느리지요
전체적인 함수 자체 수정이 불가피 합니다.
onPreExecute(){
//다이얼로그 생성
}
doInBackground(){
//웹에서 이미지 불러오는 작업만 수행
}
onPostExecute(){
//이미지를 뷰에 지정
//다이얼로그 닫기
}
AsyncTask 자체를 잘못 이해하고 사용하셨습니다.
구글 Docs 를 다시 읽어보시기 바랍니다.




AsyncTask 사용 자체는 잘하신거 같은데... Toast가 표시되는 액티비티가 정확한지 확인해보세요.. 음 소스만 봐서는 머가 A,B인지 모르겠네요.. http://androday.com/24에서 AsyncTask 로딩처리 한번 보시고 확인해보세요