Android 기반 – Activity 간 데이터 전송(bitmap 및 맵 객체)

4115 단어 Android
이쪽의 문장은 매우 낡아서 친구의 회답이 있는 것을 보았습니다. 여기는 몇 가지를 갱신하여 여러분을 오도하지 않도록 합니다.
첫째, HashMap 객체 전달
해시맵 자체는 클로너블, 서리라이저블, Intent 전달 시 바로 강하게 돌리면 된다.(@qcks 지적 감사)
Map params = new HashMap<>();
params.put("key", "value");

Intent intent = new Intent(app, Activity.class);
intent.putExtra("parmas",(Serializable)params);

2. 비트맵 전송
Intent를 통해서 보내지 말라고 한 번 강조해주세요.
2.1 로컬 자원은 R.id만 전달하고 Resource를 통해 해석한다.
2.2 SD카드에 있는 파일이면 Uri만 전달합니다.
2.3 네트워크 흐름이라면 먼저 로컬로 그림을 저장한 다음에 경로 Uri를 전달한다.
 
또한, Intent가 전달할 수 있는 데이터의 크기가 제한되어 있고 구체적인 수량은 제가 실제로 테스트한 적이 없습니다. ROOM이 설정한 APP의 최대 메모리와 관련이 있습니다. 인터넷에서 어떤 사람이 실제 코드 테스트를 했습니다. 주소:https://blog.csdn.net/wingichoy/article/details/50679322
 
당시의 작법 수준은 매우 low적이었다. 단지 프로젝트를 완성하기 위해 쓸 수 있는 방안을 만들었을 뿐이다. 나중에 보면 물의 일비였다.
 
 
 
 
더 이상 내려다볼 필요 없어, 이전의 오래된 방안은 정말 차마 볼 수가 없어~~
----------------------------------------나는 분할선 2018.8.20, ----------------------------------------------------------------------------
프로젝트를 할 때 2개의activity 사이에서 데이터를 전달하는 데 사용해야 한다. 이전에 한 것은 모두 문자열 같은 것들이었다. 결국 이번에는 오랫동안 렉이 걸려서 오후 내내 괴롭혔다.
첫 번째:비트맵 전달
이 문제는 매우 기이하다. (아마도 내 안드로이드 수준이 아직 부족할 것이다.) 잘못 보고하지 않을 것이다. 나는 버블이나 Intent의extral 영역으로bitmap을 직접 저장했는데, 결과적으로 운행할 때 각종 다운이 되고 각종 인터페이스가 혼란스럽다. (나는 매우 궁금하다.)검색해 보니 40k보다 큰 그림을 직접 전달할 수 없다고 하니 덕문포럼에서 이해법을 찾아보자.비트맵을byte 그룹으로 저장한 다음 Intent를 통해 전달하는 것입니다.

코드는 다음과 같습니다.
 
	Bitmap bmp=((BitmapDrawable)order_con_pic.getDrawable()).getBitmap();
	Intent intent=new Intent(OrderConfirm.this,ShowWebImageActivity.class);
	ByteArrayOutputStream baos=new ByteArrayOutputStream();
	bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
	byte [] bitmapByte =baos.toByteArray();
	intent.putExtra("bitmap", bitmapByte);
	startActivity(intent);

그 중에서 첫 번째 행 코드는 이미지뷰에서 어떻게 그림을 얻을 수 있는지입니다. 이 문제도 뒤바뀌었습니다. setDrawingCacheEnabled를 사용해도 될 것 같습니다. 처음에 사용한 이 방법은activity 사이에bitmap을 직접 전달하기 때문에 실행할 때 오류가 발생했고 나중에 고친 후에 다시 시도하지 않았습니다.
 
먼저 new의 Byte Array Output Stream 흐름을 사용한 다음에 비트맵의compress 방법을 사용하여 데이터를byte로 압축하여 전송하면 된다.
다른 activity에서 찾을 수 있는 방법은 다음과 같습니다.
 
imageView = (ZoomableImageView) findViewById(R.id.show_webimage_imageview);
		Intent intent=getIntent();
		if(intent !=null)
		{
			byte [] bis=intent.getByteArrayExtra("bitmap");
			Bitmap bitmap=BitmapFactory.decodeByteArray(bis, 0, bis.length);
			imageView.setImageBitmap(bitmap);
		}

바이트 배열을 꺼낸 후 BitmapFactory의 decodeByteArray 방법으로bitmap을 조합하면 됩니다.
 
여기에 저장된 코드가 하나 더 있습니다.
 
public void saveMyBitmap(String bitName,Bitmap mBitmap) throws IOException {
	    File f = new File("/sdcard/Note/" + bitName);
		if(!f.exists())
			f.mkdirs();//           ,  file not found  
		f=new File("/sdcard/Note/"+bitName+".png");
	    f.createNewFile();
	    try {
	    	FileOutputStream out = new FileOutputStream(f);
	    	 mBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
	    	 out.flush();
	    	 out.close();
	    } catch (FileNotFoundException e) {
	            Log.i(TAG,e.toString());
	    }
	   
	}

 
 
 
 
 
2. 맵 객체 전송:
bundle로 캡슐화하기
 
	Map data=orderlist.get(arg2-1);
				SerializableMap tmpmap=new SerializableMap();
				tmpmap.setMap(data);
				bundle.putSerializable("orderinfo", tmpmap);
			    intent.putExtras(bundle);

이 SeralizableMap은 Serializable 인터페이스를 구현한 클래스입니다.
 
 
public class SerializableMap implements Serializable {
	private Map map;
	public Map getMap()
	{
		return map;
	}
	public void setMap(Map map)
	{
		this.map=map;
	}
}

이렇게 해야만 맵의 대상을 버블에 던질 수 있고,
 
빼내는 방법:
 
Bundle bundle = getIntent().getExtras();
		SerializableMap serializableMap = (SerializableMap) bundle
				.get("orderinfo");

 
 
 
 
 

좋은 웹페이지 즐겨찾기