设置视图背景导致的OutOfMemoryError [英] Setting view background causes OutOfMemoryError

查看:1490
本文介绍了设置视图背景导致的OutOfMemoryError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我只是试图改变应用程序的背景图像,它没有任何关系在现在还和我只是想主要活动的背景更改为图像。 它在preVIEW显示正常,但是当我来​​到无论是在仿真器或我的物理设备上运行它,我得到这个错误。

  

抛出的OutOfMemoryError无法分配604786188字节   分配与4194208免费字节和230MB直到OOM

图片小于1.5MB,所以我不知道为什么它会耗尽内存或者试图分配太多。

我所做的只是打开一个空白的项目,改变相对布局的背景。

奇怪的是,如果我运行在一个承上启下4仿真器正常工作的应用程序,但即使是在同一个版本的Andr​​oid上承上启下5抛出这个错误。

修改

没有再收到上面的错误,而不是发生在启动应用程序的下面的错误,无论所使用的仿真器。

 致命异常:主要
    工艺:com.jacksteel.comp4,PID:2164
    java.lang.RuntimeException的:无法实例活动ComponentInfo {com.jacksteel.comp4 / com.jacksteel.comp4.MainActivity}:显示java.lang.NullPointerException:尝试调用虚拟方法android.view.View android.view.Window。在一个空对象引用findViewById(INT)'
            在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2236)
            在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
            在android.app.ActivityThread.access $ 800(ActivityThread.java:151)
            在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1303)
            在android.os.Handler.dispatchMessage(Handler.java:102)
            在android.os.Looper.loop(Looper.java:135)
            在android.app.ActivityThread.main(ActivityThread.java:5257)
            在java.lang.reflect.Method.invoke(本机方法)
            在java.lang.reflect.Method.invoke(Method.java:372)
            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903)
            在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
     显示java.lang.NullPointerException:产生的原因试图调用虚拟方法android.view.View android.view.Window.findViewById(INT)'对空对象引用
            在android.app.Activity.findViewById(Activity.java:2072)
            在com.jacksteel.comp4.MainActivity< INIT>(MainActivity.java:20)
            在java.lang.reflect.Constructor.newInstance(本机方法)
            在java.lang.Class.newInstance(Class.java:1606)
            在android.app.Instrumentation.newActivity(Instrumentation.java:1066)
            在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2226)
在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
在android.app.ActivityThread.access $ 800(ActivityThread.java:151)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1303)
在android.os.Handler.dispatchMessage(Handler.java:102)
在android.os.Looper.loop(Looper.java:135)
在android.app.ActivityThread.main(ActivityThread.java:5257)
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
 

编辑2 来源$ C ​​$ C

 包com.jacksteel.comp4;

进口android.content.res.Resources;
进口android.graphics.Bitmap;
进口android.graphics.BitmapFactory;
进口android.graphics.drawable.BitmapDrawable;
进口android.support.v7.app.AppCompatActivity;
进口android.os.Bundle;
进口android.view.Menu;
进口android.view.MenuItem;
进口android.widget.RelativeLayout;


 公共类MainActivity扩展AppCompatActivity {
     私人RelativeLayout的博伽梵歌=(RelativeLayout的)findViewById(R.id.MainBg);
    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);

        点阵位图=去codeSampledBitmapFromResource(getResources(),R.drawable.redboxes,Bg.getWidth(),Bg.getHeight());
        资源RES = getResources();
        BitmapDrawable backgroundDrawable =新BitmapDrawable(资源,位图);
        Bg.setBackgroundDrawable(backgroundDrawable);
    }


     @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        //充气菜单;这增加了项目操作栏,如果它是present。
        。getMenuInflater()膨胀(R.menu.menu_main,菜单);
        返回true;
    }

    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){
        //处理动作栏项目点击这里。将操作栏
        //自动在主/向上按钮操作的点击,只要
        //你在AndroidManifest.xml中指定一个父活动。
        INT的id = item.getItemId();

        // noinspection SimplifiableIfStatement
        如果(ID == R.id.action_settings){
            返回true;
        }

        返回super.onOptionsItemSelected(项目);
    }

    公共静态INT calculateInSampleSize(
            BitmapFactory.Options选项,INT reqWidth,诠释reqHeight){
        //原始高度和宽度的图像
        最终诠释身高= options.outHeight;
        最终诠释宽度= options.outWidth;
        INT inSampleSize = 1;

        如果(高度> reqHeight ||宽度GT; reqWidth){

            最终诠释halfHeight =身高/ 2;
            最终诠释半宽度=宽度/ 2;

            //计算最大inSampleSize值是2的幂,并保持这两个
            //高度和宽度小于所需的高度和宽度。
            而((halfHeight / inSampleSize)> reqHeight
                    &功放;&安培; (半角/ inSampleSize)> reqWidth){
                inSampleSize * = 2;
            }
        }

        返回inSampleSize;
    }
    公共静态位图德codeSampledBitmapFromResource(资源RES,INT渣油,诠释reqWidth,诠释reqHeight){

        //第一代code与inJustDe codeBounds = true来检查尺寸
        最后BitmapFactory.Options选项=新BitmapFactory.Options();
        options.inJustDe codeBounds = TRUE;
        BitmapFactory.de codeResource(RES,渣油,期权);

        //计算inSampleSize
        options.inSampleSize = calculateInSampleSize(选项,reqWidth,reqHeight);

        与inSampleSize集//德code位图
        options.inJustDe codeBounds = FALSE;
        返回BitmapFactory.de codeResource(RES,渣油,期权);
    }
}
 

修改3 更新

更新的源$ C ​​$ C

  @覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);
    最后RelativeLayout的博伽梵歌=(RelativeLayout的)findViewById(R.id.MainBg);

    Bg.getViewTreeObserver()。addOnGlobalLayoutListener(新ViewTreeObserver.OnGlobalLayoutListener(){
        @覆盖
        公共无效onGlobalLayout(){
            。Bg.getViewTreeObserver()removeGlobalOnLayoutListener(本);
            点阵位图=去codeSampledBitmapFromResource(getResources(),R.drawable.redboxes,Bg.getWidth(),Bg.getHeight());
            资源RES = getResources();
            BitmapDrawable backgroundDrawable =新BitmapDrawable(资源,位图);
            Bg.setBackgroundDrawable(backgroundDrawable);
        }
    });

}
 

更新错误

 致命异常:主要
    工艺:com.jacksteel.comp4,PID:1872年
    java.lang.OutOfMemoryError:无法分配一个107347980字节分配与1048576免费字节和63MB,直到OOM
            在dalvik.system.VMRuntime.newNonMovableArray(本机方法)
            在android.graphics.BitmapFactory.nativeDe $ C $检测板(本机方法)
            在android.graphics.BitmapFactory.de codeStream(BitmapFactory.java:609)
            在android.graphics.BitmapFactory.de codeResourceStream(BitmapFactory.java:444)
            在android.graphics.BitmapFactory.de codeResource(BitmapFactory.java:467)
            在com.jacksteel.comp4.MainActivity.de codeSampledBitmapFromResource(MainActivity.java:93)
            在com.jacksteel.comp4.MainActivity $ 1.onGlobalLayout(MainActivity.java:27)
            在android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:912)
            在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1881)
            在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
            在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5885)
            在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:767)
            在android.view.Choreographer.doCallbacks(Choreographer.java:580)
            在android.view.Choreographer.doFrame(Choreographer.java:550)
            在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:753)
            在android.os.Handler.handleCallback(Handler.java:739)
            在android.os.Handler.dispatchMessage(Handler.java:95)
            在android.os.Looper.loop(Looper.java:135)
            在android.app.ActivityThread.main(ActivityThread.java:5257)
            在java.lang.reflect.Method.invoke(本机方法)
            在java.lang.reflect.Method.invoke(Method.java:372)
            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903)
            在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
 

解决方案

更新

您应该把图像,你将与 BitmapFactory.de codeResource()绘制-nodpi 目录,以避免密度,在使用缩放 drawable-<密度> 目录名到您的设备屏幕像素密度

在你的情况,你的推图像绘制,华电国际目录和您的设备有 xxhdpi 屏幕,以便在 BitmapFactory.de codeResource() inSampleSize = 2 图像进行2倍放大(从华电国际 xxhdpi )和2倍缩小(由 inSampleSize )保持在原来的大小和通过的OutOfMemoryError 造成应用程序崩溃。

原来的答案

1.5MB是COM pressed图像的大小。当您加载到的ImageView 或其它视图背景则位图被隐式创建。在位图图像的每个像素需要4个字节。所以,如果你的图像具有4096×4096像素,然后它需要在内存64兆,虽然图像可以充满了单色,只需要几KB COM pressed为PNG或JPEG的分辨率。

您应该确定您的视图的实际尺寸和负荷缩放图像:

  view.getViewTreeObserver()。addOnGlobalLayoutListener(新ViewTreeObserver.OnGlobalLayoutListener(){
        @覆盖
        公共无效onGlobalLayout(){
            。view.getViewTreeObserver()removeGlobalOnLayoutListener(本);
            点阵位图= ImageUtils.de codeSampledBitmapFromFile(backgroundImageFile,view.getWidth(),view.getHeight());
            view.setBackground(新BitmapDrawable(getResources(),位图));
        }
    });
 

还有就是我的实用方法加载比例位图文件

 公共类ImageUtils {
    公共静态位图德codeSampledBitmapFromFile(档案文件,诠释reqWidth,诠释reqHeight){

        //第一代code与inJustDe codeBounds = true来检查尺寸
        最后BitmapFactory.Options选项=新BitmapFactory.Options();
        options.inJustDe codeBounds = TRUE;
        BitmapFactory.de codeFILE(file.getAbsolutePath(),选件);

        //计算inSampleSize
        options.inSampleSize = calculateInSampleSize(选项,reqWidth,reqHeight);

        与inSampleSize集//德code位图
        options.inJustDe codeBounds = FALSE;
        返回BitmapFactory.de codeFILE(file.getAbsolutePath(),选件);
    }

     公共静态INT calculateInSampleSize(BitmapFactory.Options选项,诠释reqWidth,诠释reqHeight){
        //原始高度和宽度的图像
        最终诠释身高= options.outHeight;
        最终诠释宽度= options.outWidth;
        INT inSampleSize = 1;

        如果(高度> reqHeight ||宽度GT; reqWidth){

            //计算的高度和宽度的比率要求的高度和宽度
            最终诠释heightRatio = Math.floor((浮动)的高度/(浮点)reqHeight);
            最终诠释widthRatio = Math.floor((浮点)宽/(浮点)reqWidth);

            //选择最小比例为inSampleSize值,这将保证
            //与两个尺寸大于或等于所述最终图像
            //请求的高度和宽度。
            inSampleSize = heightRatio< widthRatio? heightRatio:widthRatio;
        }

        返回inSampleSize;
    }
}
 

您可以使用其他 BitmapFactory 的方法来解除code 位图从流,资源和字节数组。

I'm just trying to change the background image of the app, it has nothing in it yet and i just wanted to change the background of the main activity to an image. It displays correctly in the preview but when I come to run it either on an emulator or on my physical device I get this error.

Throwing OutOfMemoryError "Failed to allocate a 604786188 byte allocation with 4194208 free bytes and 230MB until OOM"

The image is less than 1.5MB so I have no clue why it would run out of memory or be trying to allocate that much.

all I did was open a blank project and change the background of the relative layout.

The strange thing is if I run the app on a nexus 4 emulator it works fine, but a nexus 5 even on the same version on android throws this error.

EDIT

No longer getting the above error instead the following error occurs on launch of the app regardless of the emulator used.

FATAL EXCEPTION: main
    Process: com.jacksteel.comp4, PID: 2164
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.jacksteel.comp4/com.jacksteel.comp4.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2236)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference
            at android.app.Activity.findViewById(Activity.java:2072)
            at com.jacksteel.comp4.MainActivity.<init>(MainActivity.java:20)
            at java.lang.reflect.Constructor.newInstance(Native Method)
            at java.lang.Class.newInstance(Class.java:1606)
            at android.app.Instrumentation.newActivity(Instrumentation.java:1066)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2226)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

EDIT 2 Source Code

 package com.jacksteel.comp4;

import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.RelativeLayout;


 public class MainActivity extends AppCompatActivity {
     private RelativeLayout Bg = (RelativeLayout) findViewById(R.id.MainBg);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Bitmap bitmap = decodeSampledBitmapFromResource(getResources(),R.drawable.redboxes,Bg.getWidth(), Bg.getHeight());
        Resources res = getResources();
        BitmapDrawable backgroundDrawable = new BitmapDrawable(res, bitmap);
        Bg.setBackgroundDrawable(backgroundDrawable);
    }


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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            final int halfHeight = height / 2;
            final int halfWidth = width / 2;

            // Calculate the largest inSampleSize value that is a power of 2 and keeps both
            // height and width larger than the requested height and width.
            while ((halfHeight / inSampleSize) > reqHeight
                    && (halfWidth / inSampleSize) > reqWidth) {
                inSampleSize *= 2;
            }
        }

        return inSampleSize;
    }
    public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,int reqWidth, int reqHeight) {

        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, resId, options);

        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(res, resId, options);
    }
}

EDIT 3 Update

Updated Source code

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final RelativeLayout Bg = (RelativeLayout) findViewById(R.id.MainBg);

    Bg.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Bg.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            Bitmap bitmap = decodeSampledBitmapFromResource(getResources(), R.drawable.redboxes, Bg.getWidth(), Bg.getHeight());
            Resources res = getResources();
            BitmapDrawable backgroundDrawable = new BitmapDrawable(res, bitmap);
            Bg.setBackgroundDrawable(backgroundDrawable);
        }
    });

}

Updated Error

FATAL EXCEPTION: main
    Process: com.jacksteel.comp4, PID: 1872
    java.lang.OutOfMemoryError: Failed to allocate a 107347980 byte allocation with 1048576 free bytes and 63MB until OOM
            at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
            at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
            at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)
            at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
            at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:467)
            at com.jacksteel.comp4.MainActivity.decodeSampledBitmapFromResource(MainActivity.java:93)
            at com.jacksteel.comp4.MainActivity$1.onGlobalLayout(MainActivity.java:27)
            at android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:912)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1881)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
            at android.view.Choreographer.doCallbacks(Choreographer.java:580)
            at android.view.Choreographer.doFrame(Choreographer.java:550)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

解决方案

UPDATE

You should put image that you will load with BitmapFactory.decodeResource() to drawable-nodpi directory to avoid scaling from density that used in drawable-<density> directory name to your device screen density.

In your case you putted image in drawable-hdpi directory and your device has xxhdpi screen so in BitmapFactory.decodeResource() with inSampleSize=2 image were 2x scaled up (from hdpi to xxhdpi) and 2x scaled down (by inSampleSize) remaining at original size and causing application crash by OutOfMemoryError.

ORIGINAL ANSWER

1.5MB is the size of compressed image. When you load it to ImageView or background of some other view then Bitmap is implicitly created. In Bitmap every pixel of image takes 4 bytes. So if your image has a resolution of 4096x4096 pixels then it takes 64 megabytes in memory though image could be filled with single color and takes only few kilobytes compressed to png or jpeg.

You should determine real size of your view and load scaled image:

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            Bitmap bitmap = ImageUtils.decodeSampledBitmapFromFile(backgroundImageFile, view.getWidth(), view.getHeight());
            view.setBackground(new BitmapDrawable(getResources(), bitmap));
        }
    });

There is my utility method to load scaled Bitmap from File:

public class ImageUtils {
    public static Bitmap decodeSampledBitmapFromFile(File file, int reqWidth, int reqHeight) {

        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(file.getAbsolutePath(), options);

        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(file.getAbsolutePath(), options);
    }

     public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            // Calculate ratios of height and width to requested height and width
            final int heightRatio = Math.floor((float) height / (float) reqHeight);
            final int widthRatio = Math.floor((float) width / (float) reqWidth);

            // Choose the smallest ratio as inSampleSize value, this will guarantee
            // a final image with both dimensions larger than or equal to the
            // requested height and width.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }

        return inSampleSize;
    }
}

You can use other BitmapFactory methods to decode Bitmap from stream, resource and byte array.

这篇关于设置视图背景导致的OutOfMemoryError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆