所以这是交易。我有一个我正在创建的游戏,它有一个倒数计时器和一个随机数发生器。简单。好吧,我让游戏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内存分析,但是没有任何运气可以让它运行起来。
答案 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。调查。