IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Parcelable(传递Bitmap)应用 -> 正文阅读

[移动开发]Android Parcelable(传递Bitmap)应用

先不废话先上代码吧! 我们就不讲intent的传递方式了因为这个很常见
Parcelable

public class NewsBean implements Parcelable {

    public String name;

    public int age;

    public String profession;

    public byte[] bytesFromBitmap;

    public NewsBean(Parcel in) {
        name = in.readString();
        age = in.readInt();
        profession = in.readString();
        bytesFromBitmap = in.createByteArray();
    }

    public static final Creator<NewsBean> CREATOR = new Creator<NewsBean>() {
        @Override
        public NewsBean createFromParcel(Parcel in) {
            return new NewsBean(in);
        }

        @Override
        public NewsBean[] newArray(int size) {
            return new NewsBean[size];
        }
    };

    public NewsBean(String benZeph, int i, String s, byte[] bytesFromBitmap) {
        this.name = benZeph;
        this.age = i;
        this.profession = s;
        this.bytesFromBitmap=bytesFromBitmap;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
        dest.writeString(profession);
        dest.writeByteArray(bytesFromBitmap);
    }
}

注意??因为Parcelable里面没有传递bitmap的方法所以这边先将数据类变为ByteArray,后续会转换过来设置就行了

//bitmap转byte
    private byte[] getBytesFromBitmap(Bitmap bitmap) {
        ByteArrayOutputStream outputStream = 
            new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 0, outputStream);
        return outputStream.toByteArray();
    }

    //byte转bitmap
    private Bitmap getBitmapFromArrayBytes(byte[] bytes){
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    }

使用 接下来这两个类是用于将数据透传递到自定义view(为了自定义view添加任何网络请求)
请添加图片描述
TargetApi类

/** Indicates that Lint should treat this type as targeting a given API level, no matter what the
 project target is. */
@Target({TYPE, METHOD, CONSTRUCTOR, FIELD})
@Retention(RetentionPolicy.CLASS)
public @interface TargetApi {
    /**
     * This sets the target api level for the type..
     */
    int value();
}

RemotableViewMethod类

/**
 * @hide
 * This annotation indicates that a method on a subclass of View
 * is alllowed to be used with the {@link android.widget.RemoteViews} mechanism.
 */
@TargetApi(30)
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface RemotableViewMethod {
    /**
     * @return Method name which can be called on a background thread. It should have the
     * same arguments as the original method and should return a {@link Runnable} (or null)
     * which will be called on the UI thread.
     */
    String asyncImpl() default "";
}

//数据管理类

public class MyDemoDataManager {
    private static final long FLAG_REQUEST_TIME_OUT = 5 * 1000;//flag icon 超时 5s
    private String url = "https://wx1.sinaimg.cn/large/006L5ZD9ly8gt6y744rraj30dw0dwmxw.jpg";

    private static int FLAG_ICON_SIZE;

    static {
        FLAG_ICON_SIZE = 13;
    }

    private volatile static MyDemoDataManager sInstance;

    public Context mContext;

    private ArrayList<NewsBean> mNews = new ArrayList<NewsBean>();

    public static MyDemoDataManager getInstance(Context context) {
        if (sInstance == null) {
            synchronized (MyDemoDataManager.class) {
                if (sInstance == null) {
                    sInstance = new MyDemoDataManager(context);
                }
            }
        }
        return sInstance;
    }

    private MyDemoDataManager(Context context) {
        if (context.getApplicationContext() != null) {
            mContext = context.getApplicationContext();
        } else {
            mContext = context;
        }
        init();
    }

    private void init() {
        Bitmap bitmap = loadImageSync(url, 30, 30);
        byte[] bytesFromBitmap = getBytesFromBitmap(bitmap);
        NewsBean benParcelable = new NewsBean("BenZeph", 23, "1111",bytesFromBitmap);
        NewsBean benParcelable1 = new NewsBean("BenZeph", 23, "1111",bytesFromBitmap);
        NewsBean benParcelable2 = new NewsBean("BenZeph", 23, "1111",bytesFromBitmap);
        mNews.add(benParcelable);
        mNews.add(benParcelable1);
        mNews.add(benParcelable2);

    }
    //bitmap转byte
    private byte[] getBytesFromBitmap (Bitmap bitmap){
        ByteArrayOutputStream outputStream =
                new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 0, outputStream);
        return outputStream.toByteArray();
    }
    
    //使用blockingQueue和异步线程 实现带有超时的 同步图片请求(添加依赖这个方法就可以用)
    public static Bitmap loadImageSync(final String url, final int width, final int height) {
        final LinkedBlockingDeque<Bitmap[]> blockingDeque = new LinkedBlockingDeque<Bitmap[]>();
        ConcurrentManager.getInsance().execute(new Runnable() {
            @Override
            public void run() {
                try {
                    Bitmap bm = ImageLoader.getInstance().loadImageSync(url, new ImageSize(width, height));
                    blockingDeque.offer(new Bitmap[]{bm});
                } catch (Throwable t) {
                    t.printStackTrace();
                    blockingDeque.offer(new Bitmap[]{null});
                    Log.e("HotSearchWidgetPresenter loadImageSync:t", t + "");

                }
            }
        });
        try {
            Bitmap[] poll = blockingDeque.poll(FLAG_REQUEST_TIME_OUT, TimeUnit.MILLISECONDS);
            return poll == null ? null : poll[0];
        } catch (InterruptedException e) {
            e.printStackTrace();
            Log.e("HotSearchWidgetPresenter loadImageSync:", e + "");
        }
        return null;
    }

    public ArrayList<NewsBean> getNewsData() {
        return mNews;
    }

数据发送

 void updateAppWidget(Context context, final AppWidgetManager appWidgetManager, final int appWidgetId) {
        // Construct the RemoteViews object
        final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.standard_app_widget);
        final Bundle bundle = new Bundle();
         bundle.setClassLoader(bundle.getClass().getClassLoader());
         ArrayList<NewsBean> newsData = MyDemoDataManager.getInstance(context).getNewsData();
         bundle.putParcelableArrayList("data", newsData);
         views.setBundle(R.id.my_rootview,"updateMyData",bundle);
         Log.d("tjk4","updateAppWidget appWidgetId = "+appWidgetId);
         // Instruct the widget manager to update the widget
         appWidgetManager.updateAppWidget(appWidgetId, views);
    }

数据接收

   @RemotableViewMethod
    public void updateMyData(Bundle bundle) {
        Log.d(TAG, "updateMyDatabundle.getClass()" + getClass().getClassLoader());
        bundle.setClassLoader(getClass().getClassLoader());
        ArrayList<NewsBean> newsDatas = bundle.getParcelableArrayList("data");
        Log.d(TAG, "updateMyData newsDatas.size=" + newsDatas.size());
        if (newsDatas != null) {
            mNewsViewPager.updateNews(newsDatas);
        }
    }

注意?? bundle.setClassLoader(getClass().getClassLoader());这行代码一定要加不然就会报错
Class not found when unmarshalling,可能是获取不到对应的classLoader吧
注意??bundle.getParcelableArrayList这个get类型一定要与传递的类型一致不然无法传递数据
然后到 mNewsViewPager.updateNews(newsDatas);我就不往后继续发了这个时候数据已经过来了后面就是项目代码了,大家可以避坑然后根据需求开发!
这样Parcelable的数据传递就完成?了!

时间原因后续更新Serializable等!

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-26 12:19:17  更:2021-10-26 12:19:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:26:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码