안드로이드 개발 질문/답변
(글 수 45,052)
서버에있는 이미지를 받아와 뷰페이저로 띄워주는 겁니다...
근데 어떤식으로해야할지 갈피를 못잡겠네요
맨 처음에 어싱크로 이미지가 받아지면 띄워주면서 시작을 하고
동시에 다음 이미지를 다운받아 저장을하고 다음 이미지를 보면 그다음이미지가 다운받아지는 걸로 구현하려고합니다
어싱크테스크로 하고 있는데 정말 갈피를 못잡겟네요 ㅠㅠ
어떠한 방식으로 수정해야할 지 궁금해서 질문드립니다
짜달라는게 아니라 어떤식으로 전개해야할지 질문드립니다 ㅠㅠ 부탁드립ㄴ다
package com.example.viewp;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
public class MainActivity extends Activity {
ProgressDialog dialog;
ImageView imageView;
Bitmap bitmap = null;
ViewPager viewPager;
Bitmap bit[] = new Bitmap[]{null,null,null};
ImagePagerAdapter adapter = new ImagePagerAdapter();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int temp;
//for(temp = 1; temp<4; temp++){
new ImageTask().execute();
//}
viewPager = (ViewPager) findViewById(R.id.view_pager);
}
private class ImagePagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return 3;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((ImageView) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Context context = MainActivity.this;
imageView = new ImageView(context);
int padding = context.getResources().getDimensionPixelSize(R.dimen.padding_medium);
imageView.setPadding(padding, padding, padding, padding);
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
imageView.setImageBitmap(bit[position]);
//imageView.setImageResource(mImages[position]);
((ViewPager) container).addView(imageView, 0);
return imageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView((ImageView) object);
}
}
class ImageTask extends AsyncTask<Void, Void, Bitmap>{
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
super.onCancelled();
}
@Override
protected Bitmap doInBackground(Void... params) {
// TODO Auto-generated method stub
URL url = null;
URLConnection conn;
//int i = Integer.parseInt(a);
//i++;
//String kk = Integer.toString(params[0]);
//Log.i("check", "kk = "+kk);
try {
url = new URL("http:///"+2+".jpg");
conn = url.openConnection();
conn.connect();
BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
bitmap = BitmapFactory.decodeStream(bis);
bit[0] = BitmapFactory.decodeStream(bis);
bis.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
dialog = ProgressDialog.show(MainActivity.this, "불러오는중", "잠시만 기다려 주세요");
super.onPreExecute();
}
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
dialog.dismiss();
viewPager.setAdapter(adapter);
imageView.setImageBitmap(result);
super.onPostExecute(result);
}
}
}
2013.01.14 17:02:09
일단 페이지 이동을 하면
getView(0) getView(1) getView(2) 가 호출되고
또 페이지 이동하면 getView(0) getView(1) getView(2) 가 호출되죠
ViewPager 는 페이지 이동전에 화면을 만든다음에 이동을 합니다.
(느낌상으로는 페이지 만들고 스샷찍어서 슬라이딩되고 그 다음에 다시 View를 붙이는 듯 합니다. 확실한건 아님 ㅠㅜ)
그래서 움직일때 화면이 필요해서 어싱크 돌리면 안되고 돌리기 전에 화면을 만들어 놓아야 합니다.
SpareArray<Bitmap> mBitmap = new SpareArray<Bitmap>();
onCreate() {
ViewPager viewpager;
viewpager.setOnpageChangedListener(new OnPagerChangedListener() { // 이름이 이게 맞는지는 잘 기억이.... -_-;;
페이지가 바뀔때마다 페이지가 0보다 크고 3보다 작고
mBitmap에 페이지 + 1 포지션에 이미지가 없으면
new ImageTask(페이지 + 1).execute();
이미지 받는 중이면 페이징 이동 못해야 하고......
}
new ImageTask(0).execute();
}
class ImageTask extends AsyncTask<Void, Void, Bitmap>{
이미지 받고... mBitmap.put(인덱스,bitmap) 으로 추가.....
}
머 대충 이렇게요?????
메모리 관리가 필요는 하겠지만요 -_-;;
imageview와 포지션값을 task에 변수로 넘겨서 처리한적이 있습니다
뷰페이저6개에 페이지 하나당 16개 가량 이미지를 읽어오는 방식이었는데...
최초실행시 한큐에 80개 읽어오는거 보고 멘붕....
이후 task생성숫자를 제한해서 해결했습죠...