简体   繁体   English

当在gridview中单击除前三个图像以外的任何其他图像时,应用程序突然关闭。

[英]When clicked on any other images apart from first three in the gridview, app abruptly shuts down.

When I click on any of the first three images in the grid view, I can see that image in the full screen view. 当单击网格视图中的前三个图像时,可以在全屏视图中看到该图像。 But when I click on any of the rest of the images, my app abruptly shuts down. 但是,当我单击其余所有图像时,我的应用程序突然关闭。 Do you see why? 你明白为什么吗? Here is my code: 这是我的代码:

I am a beginner. 我是初学者。 I will appreciate any answer and detail explanation. 我将不胜感激任何答案和详细解释。

MainActivity.java MainActivity.java

import java.util.ArrayList;
import android.content.Intent;
import android.os.Bundle;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;

public class MainActivity extends ActionBarActivity {
    private GridView gridView;
    private GridViewAdapter gridAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        gridView = (GridView) findViewById(R.id.gridView);
        gridAdapter = new GridViewAdapter(this, R.layout.grid_item_layout, getData());
        gridView.setAdapter(gridAdapter);

        gridView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                ImageItem item = (ImageItem) parent.getItemAtPosition(position);

                //Create intent
                Intent intent = new Intent(MainActivity.this, DetailsActivity.class);
                intent.putExtra("title", item.getTitle());
                intent.putExtra("image", item.getImage());

                //Start details activity
                startActivity(intent);
            }
        });
    }

    /**
     * Prepare some dummy data for gridview
     */
    private ArrayList<ImageItem> getData() {
        final ArrayList<ImageItem> imageItems = new ArrayList<>();
        TypedArray imgs = getResources().obtainTypedArray(R.array.image_ids);
        for (int i = 0; i < imgs.length(); i++) {
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), imgs.getResourceId(i, -1));
            imageItems.add(new ImageItem(bitmap, "Image#" + i));
        }
        return imageItems;
    }
}

DetailsActivity.java DetailsActivity.java

public class DetailsActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.details_activity);

        String title = getIntent().getStringExtra("title");
        Bitmap bitmap = getIntent().getParcelableExtra("image");

        TextView titleTextView = (TextView) findViewById(R.id.title);
        titleTextView.setText(title);

        ImageView imageView = (ImageView) findViewById(R.id.image);
        imageView.setImageBitmap(bitmap);
    }
}

GridViewAdapter.java GridViewAdapter.java

public class GridViewAdapter extends ArrayAdapter<ImageItem> {

    private Context context;
    private int layoutResourceId;
    private ArrayList<ImageItem> data = new ArrayList<ImageItem>();

    public GridViewAdapter(Context context, int layoutResourceId, ArrayList<ImageItem> data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ViewHolder holder;

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);
            holder = new ViewHolder();
            holder.imageTitle = (TextView) row.findViewById(R.id.text);
            holder.image = (ImageView) row.findViewById(R.id.image);
            row.setTag(holder);
        } else {
            holder = (ViewHolder) row.getTag();
        }


        ImageItem item = data.get(position);
        holder.imageTitle.setText(item.getTitle());
        holder.image.setImageBitmap(item.getImage());
        return row;
    }

    static class ViewHolder {
        TextView imageTitle;
        ImageView image;
    }
}

ImageItem.java ImageItem.java

public class ImageItem {
    private Bitmap image;
    private String title;

    public ImageItem(Bitmap image, String title) {
        super();
        this.image = image;
        this.title = title;
    }

    public Bitmap getImage() {
        return image;
    }

    public void setImage(Bitmap image) {
        this.image = image;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

LogCat LogCat

02-19 22:32:13.814: I/ActivityManager(661): Killing 2165:com.javatechig.gridviewexample/u0a61 (adj 0): error during init
02-19 22:32:13.861: I/art(2183): Late-enabling -Xcheck:jni
02-19 22:32:13.881: I/ActivityManager(661): Start proc com.javatechig.gridviewexample for activity com.javatechig.gridviewexample/.DetailsActivity: pid=2183 uid=10061 gids={50061, 9997} abi=x86
02-19 22:32:13.885: W/ActivityManager(661): Spurious death for ProcessRecord{14ec9f6c 0:com.javatechig.gridviewexample/u0a61}, curProc for 2165: null
02-19 22:32:13.937: E/JavaBinder(661): !!! FAILED BINDER TRANSACTION !!!
02-19 22:32:13.937: W/ActivityManager(661): Exception in new application when starting activity com.javatechig.gridviewexample/.DetailsActivity
02-19 22:32:13.937: W/ActivityManager(661): android.os.TransactionTooLargeException
02-19 22:32:13.937: W/ActivityManager(661):     at android.os.BinderProxy.transactNative(Native Method)
02-19 22:32:13.937: W/ActivityManager(661):     at android.os.BinderProxy.transact(Binder.java:496)
02-19 22:32:13.937: W/ActivityManager(661):     at android.app.ApplicationThreadProxy.scheduleLaunchActivity(ApplicationThreadNative.java:793)
02-19 22:32:13.937: W/ActivityManager(661):     at com.android.server.am.ActivityStackSupervisor.realStartActivityLocked(ActivityStackSupervisor.java:1157)
02-19 22:32:13.937: W/ActivityManager(661):     at com.android.server.am.ActivityStackSupervisor.attachApplicationLocked(ActivityStackSupervisor.java:526)
02-19 22:32:13.937: W/ActivityManager(661):     at com.android.server.am.ActivityManagerService.attachApplicationLocked(ActivityManagerService.java:6192)
02-19 22:32:13.937: W/ActivityManager(661):     at com.android.server.am.ActivityManagerService.attachApplication(ActivityManagerService.java:6254)
02-19 22:32:13.937: W/ActivityManager(661):     at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:481)
02-19 22:32:13.937: W/ActivityManager(661):     at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2407)
02-19 22:32:13.937: W/ActivityManager(661):     at android.os.Binder.execTransact(Binder.java:446)
02-19 22:32:13.937: A/ActivityManager(661): Exception thrown launching activities in ProcessRecord{f202f3b 2183:com.javatechig.gridviewexample/u0a61}
02-19 22:32:13.937: A/ActivityManager(661): android.os.TransactionTooLargeException
02-19 22:32:13.937: A/ActivityManager(661):     at android.os.BinderProxy.transactNative(Native Method)
02-19 22:32:13.937: A/ActivityManager(661):     at android.os.BinderProxy.transact(Binder.java:496)
02-19 22:32:13.937: A/ActivityManager(661):     at android.app.ApplicationThreadProxy.scheduleLaunchActivity(ApplicationThreadNative.java:793)
02-19 22:32:13.937: A/ActivityManager(661):     at com.android.server.am.ActivityStackSupervisor.realStartActivityLocked(ActivityStackSupervisor.java:1157)
02-19 22:32:13.937: A/ActivityManager(661):     at com.android.server.am.ActivityStackSupervisor.attachApplicationLocked(ActivityStackSupervisor.java:526)
02-19 22:32:13.937: A/ActivityManager(661):     at com.android.server.am.ActivityManagerService.attachApplicationLocked(ActivityManagerService.java:6192)
02-19 22:32:13.937: A/ActivityManager(661):     at com.android.server.am.ActivityManagerService.attachApplication(ActivityManagerService.java:6254)
02-19 22:32:13.937: A/ActivityManager(661):     at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:481)
02-19 22:32:13.937: A/ActivityManager(661):     at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2407)
02-19 22:32:13.937: A/ActivityManager(661):     at android.os.Binder.execTransact(Binder.java:446)
02-19 22:32:13.937: I/ActivityManager(661): Killing 2183:com.javatechig.gridviewexample/u0a61 (adj 0): error during init
02-19 22:32:14.001: W/ActivityManager(661): Force removing ActivityRecord{2922ee79 u0 com.javatechig.gridviewexample/.DetailsActivity t91}: app died, no saved state
02-19 22:32:14.024: W/ActivityManager(661): Spurious death for ProcessRecord{f202f3b 0:com.javatechig.gridviewexample/u0a61}, curProc for 2183: null
02-19 22:32:14.105: W/EGL_emulation(1016): eglSurfaceAttrib not implemented
02-19 22:32:14.105: W/OpenGLRenderer(1016): Failed to set EGL_SWAP_BEHAVIOR on surface 0xe29a1260, error=EGL_SUCCESS
02-19 22:32:14.152: W/InputMethodManagerService(661): Got RemoteException sending setActive(false) notification to pid 2130 uid 10061
02-19 22:36:33.443: I/UsageStatsService(661): User[0] Flushing usage stats to disk
02-19 22:46:35.208: I/ProcessStatsService(661): Prepared write state in 0ms
02-19 22:46:35.208: I/ProcessStatsService(661): Prepared write state in 0ms
02-19 22:46:54.854: I/ActivityManager(661): Killing 1044:com.android.printspooler/u0a50 (adj 13): empty for 1813s
02-19 22:46:54.882: I/ActivityManager(661): Killing 1587:com.android.calendar/u0a21 (adj 13): empty for 1813s
02-19 22:46:54.915: I/ActivityManager(661): Killing 1640:com.android.email/u0a31 (adj 13): empty for 1813s
02-19 22:46:54.946: I/ActivityManager(661): Killing 1669:com.android.exchange/u0a32 (adj 13): empty for 1813s
02-19 22:46:54.975: I/ActivityManager(661): Killing 1506:com.android.mms/u0a8 (adj 13): empty for 1813s
02-19 22:46:55.093: D/CountryDetector(661): No listener is left
02-19 22:46:55.103: I/ActivityManager(661): Killing 1241:android.process.media/u0a5 (adj 15): empty for 1813s
02-19 22:46:55.159: W/art(661): Long monitor contention event with owner method=void com.android.server.am.BroadcastQueue.processNextBroadcast(boolean) from BroadcastQueue.java:542 waiters=1 for 244ms
02-19 22:46:55.159: W/libprocessgroup(661): failed to open /acct/uid_10021/pid_1587/cgroup.procs: No such file or directory
02-19 22:46:55.159: W/art(661): Long monitor contention event with owner method=void com.android.server.am.BroadcastQueue.processNextBroadcast(boolean) from BroadcastQueue.java:542 waiters=2 for 217ms
02-19 22:46:55.159: W/libprocessgroup(661): failed to open /acct/uid_10031/pid_1640/cgroup.procs: No such file or directory
02-19 22:46:55.161: W/art(661): Long monitor contention event with owner method=void com.android.server.am.BroadcastQueue.processNextBroadcast(boolean) from BroadcastQueue.java:542 waiters=3 for 183ms
02-19 22:46:55.161: W/libprocessgroup(661): failed to open /acct/uid_10032/pid_1669/cgroup.procs: No such file or directory
02-19 22:46:55.162: W/libprocessgroup(661): failed to open /acct/uid_10008/pid_1506/cgroup.procs: No such file or directory
02-19 22:46:55.163: W/libprocessgroup(661): failed to open /acct/uid_10005/pid_1241/cgroup.procs: No such file or directory
02-19 22:46:55.164: W/libprocessgroup(661): failed to open /acct/uid_10050/pid_1044/cgroup.procs: No such file or directory
02-19 22:47:34.854: I/ActivityManager(661): Killing 1403:com.android.providers.calendar/u0a1 (adj 15): empty for 1819s
02-19 22:47:34.909: W/libprocessgroup(661): failed to open /acct/uid_10001/pid_1403/cgroup.procs: No such file or directory

It's a android.os.TransactionTooLargeException and from the name it is because you are passing big objects like Bitmaps on the intent. 这是一个android.os.TransactionTooLargeException ,从名称上来说,这是因为您在意图上传递了诸如Bitmaps之类的大对象。 You should only pass a reference to it, like the URL or the drawable id from the resources like in your case. 您只应传递对它的引用,例如URL或资源(例如您的情况)中的drawable id。

More Details on when you get the TransactionTooLargeException 有关何时获取TransactionTooLargeException的更多详细信息

During a remote procedure call, the arguments and the return value of the call are transferred as Parcel objects stored in the Binder transaction buffer. 在远程过程调用期间,调用的参数和返回值将作为存储在Binder事务缓冲区中的包裹对象进行传输。 If the arguments or the return value are too large to fit in the transaction buffer, then the call will fail and TransactionTooLargeException will be thrown. 如果参数或返回值太大而无法容纳在事务缓冲区中,则调用将失败,并且将引发TransactionTooLargeException。

The Binder transaction buffer has a limited fixed size, currently 1Mb , which is shared by all transactions in progress for the process. Binder事务缓冲区具有有限的固定大小,当前为1Mb ,该进程的所有正在进行的事务共享该大小。 Consequently this exception can be thrown when there are many transactions in progress even when most of the individual transactions are of moderate size. 因此,即使有许多交易正在进行,即使有许多交易正在进行,也可能引发此异常。

You are facing this exception because other images except the first 3 images are too large to pass with intent. 您将面临此异常,因为除前三个图像外,其他图像太大而无法有意通过。

You can just pass the image uri or image id of clicked item with the intent then and use that on DetailsActivity. 您可以只将意图的图像uri或图像ID传递给意图,然后在DetailsActivity上使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 当用户在 android 中突然关闭应用程序时会发生什么? - what happens when user abruptly shuts app in android? 我的Android HTML应用程序在关闭时会丢失存储在localStorage中的值。 其他人都看到这个问题? - My Android HTML application is losing values stored in localStorage when it shuts down. Anyone else see this issue? 虽然我已经提到了它的代码,但当我没有提供任何输入时,我的应用程序会关闭 - My app shuts down when I don't give any input though I have mentioned the code for it startactivity() 关闭应用程序 - startactivity() shuts app down 从SD卡安装APK成功,但启动后应用会关闭 - Installing apk from sd card is successful, but the app shuts down when started 按下按钮时,应用程序关闭。 目标是使用EditText的输入设置TextView - App shuts down when button is pressed. Objective is to set TextView with the input from EditText 单击按钮将图像添加到gridview - add images to gridview when button clicked 当在第一个片段上单击任何 Gridview 视图项时,如何在同一活动中加载另一个片段 - How to load another Fragment in the same activity when any Gridview view item get clicked on First Fragment ANDROID App在第二次打开时关闭,第一次打开时运行良好 - ANDROID App shuts down on opening the second time, works fine while opening the first time 从全屏活动返回时,UI向下移动。 怎么不显示这个? - When returning from a fullscreen activity, the UI moves down. How to not show this?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM