为什么这个简单的代码抛出TransactionTooLargeException?

时间:2014-12-20 18:18:07

标签: java android eclipse random countdowntimer

所以这是交易。我有一个我正在创建的游戏,它有一个倒数计时器和一个随机数发生器。简单。好吧,我让游戏100%工作,但是当倒数计时器到达最后一个滴答时我一直在崩溃..有时候我的意思是有时候。我收到了一个java.lang.OutOfMemory错误,但是我把它缩小到了这段代码,但它抛出了一个TansactionTooLargeException但是两个错误都发生在同一个点,最后一个滴答。

再次,这可能发生在倒数计时器运行一次或500+后,它是非常随机的,没有任何意义。

FirstClass.java代码

package com.example.testingclasses;

import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.widget.ProgressBar;
import android.widget.TextView;

public class FirstClass extends Activity {

    TextView thenumber;
    int min, max;
    ProgressBar gameTimer;
    CountDownTimer gameCountDownTimer;
    int i1, cdt,   progress ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first_class);
        FirstClass.this.random();
    }

    public void random(){ //random number generator and displayer
        TextView thenumber = (TextView)findViewById(R.id.thenumber);
            min = 1;
            max = 5;
            cdt = 2500;
            ((TextView) findViewById(R.id.thenumber)).setClickable(true);
            Random r = new Random();
            i1 = r.nextInt(max - min + 1) + min;        
            thenumber.setText(Integer.toString(i1));
            FirstClass.this.setTimer(cdt);
    }


    public void setTimer(int time) {
        gameTimer = (ProgressBar)findViewById(R.id.timetoclick);
        progress = 100;
        final int actualTime = time;
        gameTimer.setProgress(progress);
        gameCountDownTimer = new CountDownTimer(actualTime, 10) {
            int totalTime = actualTime;
            @Override
            public void onTick(long millisUntilFinished) {
                    progress = (int)((millisUntilFinished ) /(double)totalTime * 100);
                    gameTimer.setProgress(progress);
            }

            @Override
            public void onFinish() {
                //progress = 0;
                //gameTimer.setProgress(progress);
                if (progress == 0) {
                    FirstClass.this.random();   
            }   else {
                gameCountDownTimer.onFinish();
            }
          }
        }; 
        gameCountDownTimer.start();
    }   
}

activity_first_class.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.testingclasses.FirstClass" >

    <TextView
        android:id="@+id/thenumber"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/timetoclick"
        android:layout_margin="10dp"
        android:clickable="true"
        android:gravity="center_horizontal|center_vertical"
        android:onClick="onClick"
        android:text="#"
        android:textSize="200sp"
        android:background="#00000000" />

     <ProgressBar
        android:id="@+id/timetoclick"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_margin="5dp"
        android:progress="0" />

</RelativeLayout>

和崩溃:

12-20 11:57:30.594: E/JavaBinder(18000): !!! FAILED BINDER TRANSACTION !!!
12-20 11:57:30.595: E/AndroidRuntime(18000): Error reporting crash
12-20 11:57:30.595: E/AndroidRuntime(18000): android.os.TransactionTooLargeException
12-20 11:57:30.595: E/AndroidRuntime(18000):    at android.os.BinderProxy.transactNative(Native Method)
12-20 11:57:30.595: E/AndroidRuntime(18000):    at android.os.BinderProxy.transact(Binder.java:496)
12-20 11:57:30.595: E/AndroidRuntime(18000):    at android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:4100)
12-20 11:57:30.595: E/AndroidRuntime(18000):    at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:89)
12-20 11:57:30.595: E/AndroidRuntime(18000):    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
12-20 11:57:30.595: E/AndroidRuntime(18000):    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)

我正在尝试使用Eclipse内存分析,但是没有任何运气可以让它运行起来。

2 个答案:

答案 0 :(得分:1)

您的代码在此行中抛出了StackOverflowError:gameCountDownTimer.onFinish();。 这是对onFinish方法的递归调用。

答案 1 :(得分:0)

用。

替换了onFinish()代码
gameCountDownTimer.cancel();
progress = 0;
gameTimer.setProgress(progress);
FirstClass.this.random();   

解决了我在游戏中遇到的循环问题以及此处出现的问题。

onTick在onFinish()运行之前没有完成的原始问题仍然存在,但我不再得到我的原始问题,并且在此处使用上面的代码发布了失败。

其实很奇怪。这段代码在我的Nexus 5上运行正常,但是我的Digital2平板电脑我仍然看到双击/未完成onFinish。调查。