Surfaceviewを使ったゲームについて

670 views
Skip to first unread message

清野弘洋

unread,
Sep 27, 2013, 10:13:41 AM9/27/13
to android-g...@googlegroups.com
皆さんこんにちは。

現在,surfaceviewを使ったゲームを作っています。
最終的にやりたいこととして,surfaceviewを含んだlayoutファイルでsetContentViewした後に
他の画面のlayoutをsetContentViewしたいです。
以下に経緯を書きます。

はじめは,タイトル画面,ステージセレクト画面,ゲーム画面の
それぞれに対してActivityを用意していたのですが,
Intentを使うと画面遷移が遅くなってしまうため,
Activityは二つとして,基本的にActivity.setContentView()でlayoutファイルを
読み込む様にしました。
ゲーム画面まではうまく遷移してくれるのですが,
ゲームオーバー,ゲームクリア後の遷移が出来ません。
ゲームセットの判定はsurfaceview内で行い,
EventListenerを継承した独自リスナーをつかって
Activityに実装した独自リスナーのメソッドで
gamesetの画面のActivityにIntentをとばして,
元のActivityに戻った時に元のActivityのonResumeで状態にあわせて
setContentViewでタイトルや他のlayoutに画面遷移しようとしているのですが,
元のActivityに戻ってonResumeでsetContentViewを呼ぼうとすると
そこで,コードが止まってしまって,
画面も遷移しなければどうにも動かない状態になってしまいます。

長くなってしまってすいませんが,ご教授頂ければと思います。
よろしくお願いします。

awwa

unread,
Sep 27, 2013, 10:22:38 AM9/27/13
to android-g...@googlegroups.com
あわと申します。

読んでて何がなんだかわかりませんが、
とりあえず、異常終了とかしているのであればLogCatで
詳細を確認して問題のポイントをもう少し絞ってください。
要は「そこで、コードが止まってしまって」
という状況をもう少し調査してから質問し直して頂いた方がよいかと思います。

ANRなのか、異常終了なのか、ブレークポイント張っているのを忘れて固まっているように見えているだけなのか、、、

では。



2013年9月27日 23:13 清野弘洋 <armed...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
awwa <aww...@gmail.com>
Twitter http://twitter.com/awwa500
Blog http://awwa500.blogspot.com/

清野弘洋

unread,
Sep 27, 2013, 11:58:06 AM9/27/13
to android-g...@googlegroups.com
あわ様

失礼しました。
LogCatを見る限りでは,ANRも異常終了もなく,
また,ブレークポイントは元々から使用していません。
どこまでコードが読まれているのか知るために
Log.i();を使っているんですが,
setContentViewの直前まではLog.i();が出るのですが,
直後ではLog.i();が出ないです。

pirai

unread,
Sep 28, 2013, 2:59:22 PM9/28/13
to android-g...@googlegroups.com
ANR無く、次に処理が流れないと言うのは仕様的に考えられないですよね。
ログはこんな感じで入れられてるのでしょうか?
    Log.i("ログ", "Before");
    setContentView(~);
    Log.i("ログ", "After");
setContentViewをコメントにすれば、後のログも出るのでしょうか?

スタート用ActivityからインテントでゲームActivityに遷移して、ゲームが終了するとスタート用Activityに戻って、Activity#onResume(){}でレイアウト変更するということでしょうか?(だとすればActivity#onActivityResult(~){}で書くべきだと思いますが)
画面も遷移しない状態とは、そのActivityで最初にsetContentViewしたレイアウトで止まってるということでしょうか?



清野弘洋

unread,
Sep 30, 2013, 2:32:16 AM9/30/13
to android-g...@googlegroups.com
pirai 様

こんにちは。
setContentViewをコメントアウトすると後のログも出ます。
レイアウト変更に関してはおっしゃるとおりです。
遷移しないというのは,レイアウト変更後のレイアウトで固まっている状態です。


清野弘洋

unread,
Sep 30, 2013, 12:40:09 PM9/30/13
to android-g...@googlegroups.com
確認し直したところ,
setContentViewの後もLogは呼ばれていました。
onActivityResultで
setContentViewとfindViewById,setOnClickListenerをまとめたメソッド
を呼んでいます。

ただ,setOnClickListenerも呼ばれているはずなんですが,
layout内のImageButtonをタッチしても反応しません。

以下にコード貼ります
TopActivityはTitle,StageSelect,GameSetの画面を表示するActivityです。

TopActivity.java

public class TopActivity extends Activity implements ClickedListener{
SharedPreferences sp,state,stage_sp,clear;
FileOutputStream fos;
String[] stage = new String[50];
String string = "";
ImageButton start,make;
int w=0,h=0,btm_w=0,btm_h=0,stage_n=0,i=0;
WindowManager wm;
Display display;
String stageInfo,name_str,all;
MakeBlockBreak mbb;
TextView maketv;
BlockBreakStageInfo bbsi;
float[] x = new float[32];
Context context;
AnimationDrawable clear_anim;
AnimationDrawable gameover_anim;
ArrayList<StageNameAndClear> list;
GridView grid;
CustomAdapter ca;
float a=0;
Handler handler;
Timer timer;
Intent intent_to_main;
int request,result;
Bitmap btm;
ImageButton titleButton,stageButton;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
display = wm.getDefaultDisplay();
w = display.getWidth();
h = display.getHeight();
context = getBaseContext();
bbsi = new BlockBreakStageInfo(context,"tour.txt");
firstCreate();
setContents(0);
timer = new Timer();
handler = new Handler();
intent_to_main = new Intent(this,MainActivity.class);
intent_to_main.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
state = getSharedPreferences("state",MODE_APPEND);
stage_sp = getSharedPreferences("stage_n",MODE_APPEND);
clear = getSharedPreferences("clear",MODE_PRIVATE);
state.edit().putBoolean("state",false).commit();
if(clear.getBoolean("over",false)){
Log.i("toGameset",String.valueOf(clear.getBoolean("clear",false)));
clear.edit().putBoolean("over",false).commit();
}
}
@Override
public void onActivityResult(int requestCode,int resultCode,Intent data){
btm = data.getParcelableExtra("back");
setContents(3);
}
@Override
public void clicked(){
stageInfo = mbb.getStageInfoString();
all = name_str +","+"false"+","+ stageInfo;
maketv.setText(all);
}
@Override
public void onResume(){
super.onResume();
list = bbsi.getStageNamesAndClears();
ca = new CustomAdapter(getBaseContext(),R.layout.cell_grid,list);
ca.notifyDataSetInvalidated();
}
@Override
public void onPause(){
super.onPause();
/*if(state.getBoolean("state",false)){
finish();
}*/
}
public void setContents(int id){
switch(id){
case 0:
toTop();
break;

case 1:
toMake();
break;

case 2:
toStageSelect();
break;
case 3:
toGameset();
break;
}
}
public void toTop(){
setContentView(R.layout.activity_top);
ImageButton start = (ImageButton) findViewById(R.id.select);
ImageButton make = (ImageButton) findViewById(R.id.make);
start.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
setContents(2);
}
});
make.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
setContents(1);
}
});
}
public void toMake(){
setContentView(R.layout.activity_makeblockbreak);
final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mbb = (MakeBlockBreak) findViewById(R.id.make);
mbb.init(w,h,1,1);
mbb.setClickedListener(this);
maketv = (TextView) findViewById(R.id.tv);
stageInfo = mbb.getStageInfoString();
maketv.setText(stageInfo);
final EditText tate = (EditText) findViewById(R.id.tate);
final EditText yoko = (EditText) findViewById(R.id.yoko);
final EditText name = (EditText) findViewById(R.id.name);
Button edit = (Button) findViewById(R.id.edit);
Button save = (Button) findViewById(R.id.save);
   bbsi = new BlockBreakStageInfo(getBaseContext(),"tour.txt");
edit.setOnClickListener(new OnClickListener(){
private String tate_str;
private String yoko_str;

@Override
public void onClick(View v){
tate_str = tate.getText().toString();
yoko_str = yoko.getText().toString();
name_str = name.getText().toString();
if(tate_str.length()>0&yoko_str.length()>0){
if(Integer.valueOf(tate_str)>0&Integer.valueOf(yoko_str)>0&name_str.length()>0){
mbb.setK(Integer.valueOf(tate_str));
mbb.setN(Integer.valueOf(yoko_str));
mbb.invalidate();
stageInfo = mbb.getStageInfoString();
all = name_str +","+"false"+","+ stageInfo;
maketv.setText(all);
imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
});
save.setOnClickListener(new OnClickListener(){
String tate_str;
String yoko_str;

@Override
public void onClick(View v){
tate_str = tate.getText().toString();
yoko_str = yoko.getText().toString();
name_str = name.getText().toString();
if(tate_str.length()>0&yoko_str.length()>0&name_str.length()>0){
if(Integer.valueOf(tate_str)>0&Integer.valueOf(yoko_str)>0){
if(!mbb.cantSave()){
stageInfo = mbb.getStageInfoString();
all = name_str +","+"false"+","+ stageInfo;
bbsi.createNewStage("tour.txt",all);
setContents(0);
}
}
}
}
});
}
public void toGameset(){
setContentView(R.layout.activity_gameset);
ImageView backView;
ImageView image;
backView = (ImageView) findViewById(R.id.backView);
image = (ImageView) findViewById(R.id.image);
titleButton = (ImageButton) findViewById(R.id.title);
stageButton = (ImageButton) findViewById(R.id.stage);
bbsi = new BlockBreakStageInfo(getBaseContext(),"tour.txt");
GameDraw gameDraw = new GameDraw(getBaseContext());
clear_anim = gameDraw.clear_anim;
gameover_anim = gameDraw.gameover_anim;
clear = getSharedPreferences("clear",MODE_PRIVATE);
backView.setBackgroundDrawable(new BitmapDrawable(btm));
if(clear.getBoolean("clear",false)){
bbsi.setStageCleared(stage_n,true);
clear_anim.start();
image.setBackgroundDrawable(clear_anim);
image.post(new Runnable(){
@Override
public void run(){
clear_anim.start();
}
});
}
else if(!clear.getBoolean("clear",false)){
gameover_anim.start();
image.setBackgroundDrawable(gameover_anim);
image.post(new Runnable(){
@Override
public void run(){
gameover_anim.start();
}
});
}
titleButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
setContents(0);
}
});
stageButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
setContents(2);
}
});
Log.i("toGameset","after");
}
public void toStageSelect(){
setContentView(R.layout.activity_stageselect);
list = new ArrayList<StageNameAndClear>();
bbsi = new BlockBreakStageInfo(getBaseContext(),"tour.txt");
grid = (GridView) findViewById(R.id.grid);
list = bbsi.getStageNamesAndClears();
ca = new CustomAdapter(getBaseContext(),R.layout.cell_grid,list);
grid.setAdapter(ca);
stage_sp = getSharedPreferences("stage_n",Activity.MODE_PRIVATE);
grid.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
stage_sp.edit().putInt("stage_n",position+1).commit();
state.edit().putBoolean("state",true).commit();
startActivityForResult(intent_to_main,1);
}
});
}
public void firstCreate(){
sp = getSharedPreferences("first",Activity.MODE_PRIVATE);
sp.edit().putBoolean("first",true).commit();
if(sp.getBoolean("first",true)){
stage[0] = "1,false,1,1,1\n";
stage[1] = "2,false,1,1,2\n";
stage[2] = "3,false,1,1,3\n";
stage[3] = "4,false,1,1,4\n";
stage[4] = "5,false,1,1,5\n";
stage[5] = "6,false,1,1,6\n";
stage[6] = "7,false,1,1,7\n";
stage[7] = "8,false,1,1,8\n";
stage[8] = "9,false,1,1,9\n";
stage[9] = "10,false,1,1,10\n";
stage[10] = "11,false,2,1,1,2\n";
stage[11] = "12,false,2,2,1,1,1,1\n";
stage[12] = "13,false,2,2,1,2,3,4\n";
stage[13] = "14,false,2,2,2,2,2,11\n";
stage[14] = "15,false,2,3,2,1,2,1,11,1\n";
stage[15] = "16,false,3,2,1,11,1,1,11,1\n";
stage[16] = "17,false,3,3,5,5,5,1,2,1,10,10,10\n";
stage[17] = "18,false,3,3,1,2,3,4,5,6,11,7,11\n";
stage[18] = "19,false,10,1,1,2,3,4,5,6,7,8,9,10\n";
stage[19] = "20,false,1,10,1,2,3,4,5,6,7,8,9,10\n";
stage[20] = "21,false,4,4,6,6,6,6,3,3,3,3,2,2,2,2,1,11,11,1\n";
stage[21] = "22,false,4,4,1,1,1,1,2,2,2,2,3,11,11,3,4,4,4,4\n";
stage[22] = "23,false,4,4,10,10,10,10,1,1,1,1,11,2,2,11,5,5,5,5\n";
stage[23] = "24,false,3,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1\n";
stage[24] = "25,false,2,5,1,2,3,4,5,6,7,8,9,10\n";
stage[25] = "26,false,3,4,1,1,1,1,1,11,11,1,1,11,11,1,1,1,1,1\n";
stage[26] = "27,false,5,5,1,1,1,1,1,1,1,1,1,1,1,11,11,11,1,1,11,8,1,1,1,11,11,11,11\n";
stage[27] = "28,false,5,5,11,11,9,11,11,6,7,8,7,6,5,11,11,11,5,4,3,2,3,4,11,11,1,11,11\n";
stage[28] = "29,false,5,5,1,5,6,5,1,1,11,7,11,1,1,11,8,11,1,1,11,9,11,1,1,11,10,11,1\n";
stage[29] = "30,false,5,7,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0\n";
stage[30] = "31,false,5,7,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0\n";
stage[31] = "32,false,5,7,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0\n";
stage[32] = "33,false,5,7,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,1,1,1,1,1,0,0,0,0,1,0,0,0\n";
stage[33] = "34,false,5,7,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0\n";
stage[34] = "35,false,5,7,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,1,0,0,0,0,1,1,1,0,0\n";
stage[35] = "36,false,5,7,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0\n";
stage[36] = "37,false,5,7,0,0,1,1,1,0,0,0,0,1,0,1,0,0,0,0,1,1,1,0,0,0,0,1,0,1,0,0,0,0,1,1,1,0,0\n";
stage[37] = "38,false,5,7,0,0,1,1,1,0,0,0,0,1,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0\n";
stage[38] = "39,false,5,7,0,1,0,1,1,1,0,0,1,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,1,1,0\n";
stage[39] = "40,false,8,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0\n";
stage[40] = "41,false,8,8,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,0,0,1,0,0,0,0,1,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,0,0,1,1,0\n";
stage[41] = "42,false,8,8,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1\n";
stage[42] = "43,false,6,6,1,1,1,1,1,1,1,11,11,11,11,1,1,11,1,1,11,1,1,11,11,1,11,2,1,1,1,1,11,3,11,11,11,11,11,4\n";
stage[43] = "44,false,5,5,1,1,1,1,1,1,1,1,1,1,1,11,11,11,1,1,11,8,1,1,1,11,11,11,11\n";
stage[44] = "45,false,5,5,11,11,9,11,11,6,7,8,7,6,5,11,11,11,5,4,3,2,3,4,11,11,1,11,11\n";
stage[45] = "46,false,5,5,1,5,6,5,1,1,11,7,11,1,1,11,8,11,1,1,11,9,11,1,1,11,10,11,1\n";
stage[46] = "47,false,5,5,1,1,1,1,1,1,1,1,1,1,1,1,11,1,1,1,1,1,1,1,10,10,0,10,10\n";
stage[47] = "48,false,6,4,10,1,1,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,10,10,1\n";
stage[48] = "49,false,6,6,1,2,2,2,2,2,1,2,1,1,1,2,1,2,2,2,2,2,1,1,1,1,1,2,1,2,2,2,1,2,1,1,1,1,1,2\n";
stage[49] = "50,false,6,6,1,1,1,1,1,1,1,11,11,11,11,1,1,11,1,1,11,1,1,11,11,1,11,2,1,1,1,1,11,3,11,11,11,11,11,4\n";
for(int r=0;r<50;r++){
string = string + stage[r];
}
try {
fos = openFileOutput("tour.txt",MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
sp.edit().putBoolean("first",false).commit();
}
}
}

activity_gameset.xml

<?xml version="1.0" encoding="utf-8"?>

<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" >

    

    <ImageView

        android:id="@+id/backView"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:contentDescription="@string/cd"

        android:clickable="false"

        />

    

    <ImageView

        android:layout_marginTop="40dp"

        android:id="@+id/image"

        android:layout_centerHorizontal="true"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:contentDescription="@string/cd"

        />

    

    <ImageButton

        android:layout_marginTop="60dp"

        android:id="@+id/title"

        android:layout_centerHorizontal="true"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:background="@drawable/title"

        android:contentDescription="@string/cd"

        android:layout_below="@id/image"

        android:clickable="true"

        android:focusable="true"

        />

   <ImageButton

        android:layout_marginTop="20dp"

        android:id="@+id/stage"

        android:layout_centerHorizontal="true"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:contentDescription="@string/cd"

        android:layout_below="@id/title"

        android:clickable="true"

        android:focusable="true"

        />

</RelativeLayout>

Makoto Yamazaki

unread,
Sep 30, 2013, 12:56:43 PM9/30/13
to android-g...@googlegroups.com
zaki です。

まず、問題が再現する最小のコード、layout XML を作ってみるといいのではないかと思いました。


--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
YAMAZAKI Makoto

清野弘洋

unread,
Sep 30, 2013, 7:56:17 PM9/30/13
to android-g...@googlegroups.com
zaki 様

投稿ありがとうございます。
やってみます。

pirai

unread,
Oct 1, 2013, 1:33:25 PM10/1/13
to android-g...@googlegroups.com
ボタンを押して、ボタン押された反応(ボタンの色が変わる)はありますでしょうか?
リスナーのonClick(View v)内にログを入れみては?それよりデバッグモードで追った方が早いと思いますが。
activity_gameset.xml以外のレイアウトxmlはもちろんありますよね?念のためR.javaを削除して自動生成させてみてください。全レイアウトリソース番号が同じ値になってる可能性も無いことは無いかも。

清野弘洋

unread,
Oct 3, 2013, 2:57:02 AM10/3/13
to android-g...@googlegroups.com
pirai 様

Logを入れてみましたが,LogCatには出てませんでした。
ちなみに,別のLogはでているので押したのが検知されれば出るはずなんですが。。。。
デバッグモードで追うというのはUSBのデバッグ接続での実機テストということで
よろしいでしょうか。すいません,知識不足で。
genソースフォルダの削除はやってみましたがダメでした。

清野弘洋

unread,
Oct 3, 2013, 3:00:13 AM10/3/13
to android-g...@googlegroups.com
pirai 様

R.javaのlayoutを確認したのですが,
それぞれちゃんと別のリソース番号になってました。
一応,お伝えします。

清野弘洋

unread,
Oct 3, 2013, 10:29:19 AM10/3/13
to android-g...@googlegroups.com
ANRがでました。
見方が分からないのですが,
Reason: keyDispatchingTimeOutという一文がありました。

清野弘洋

unread,
Oct 9, 2013, 1:57:28 AM10/9/13
to android-g...@googlegroups.com
ANRについてですが,
Reason:keyDispatchingTimedOut とLogCatに出力されます。
traces.txtを開いて見ると,
main で,一番最初に
java.lang.Object.wait()
  - waiting on <0x400275e8>と出ています。

また,ANRが出る条件ですが,
SurfaceViewを表示させた後の画面遷移先の
ImageButtonをクリックした後,5秒ほどしたら出ます。

何が原因で,wait()が出ているのかわからないので,
原因特定の方法やtraces.txtの見方を
ご教授頂ければと思います。
よろしくお願いします。

以下に,traces.txtのmain部分の抜粋を載せます
"main" prio=5 tid=1 WAIT
  | group="main" sCount=1 dsCount=0 obj=0x40027550 self=0xcf98
  | sysTid=28054 nice=0 sched=0/0 cgrp=default handle=-1345006224
  | schedstat=( 2902130117 3722869881 12593 )
  at java.lang.Object.wait(Native Method)
  - waiting on <0x400275e8> (a java.lang.VMThread)
  at java.lang.Thread.parkFor(Thread.java:1443)
  at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48)
  at sun.misc.Unsafe.park(Unsafe.java:337)
  at java.util.concurrent.locks.LockSupport.park(LockSupport.java:157)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:808)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:841)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1171)
  at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185)
  at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261)
  at android.view.SurfaceView.updateWindow(SurfaceView.java:494)
  at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:213)
  at android.view.View.dispatchWindowVisibilityChanged(View.java:4074)
  at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:742)
  at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:742)
  at android.view.ViewRoot.performTraversals(ViewRoot.java:845)
  at android.view.ViewRoot.handleMessage(ViewRoot.java:1957)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:150)
  at android.app.ActivityThread.main(ActivityThread.java:4263)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:507)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
  at dalvik.system.NativeStart.main(Native Method)

pirai

unread,
Oct 9, 2013, 10:01:18 AM10/9/13
to android-g...@googlegroups.com
自信はありませんが・・・
Activityに戻ってきた時にメインスレッドで何か無限ループか何かが発生し、
ボタンを押してもメインスレッドで何かが動き続けてるので、
ボタンを押されたときの処理が待機状態のままになりANRが発生する。

Activityが戻ってきた時に走る処理の最後にログを入れる。
できればどこかにブレークポイントを置いて、デバッグモードで追いかける。
デバッグモードは、「実行」でなく「デバッグ」でアプリを起動させてください。

清野弘洋

unread,
Oct 12, 2013, 11:25:32 AM10/12/13
to android-g...@googlegroups.com
pirai 様

遅くなってしまい,すいません。
デバッグモードで追いかけてみました。

eclipseでデバッグパースペクティブが開かれました。
ただ,すいません。
デバッグモードで追いかけて何が分かるのか
どんな利点があるのか,
知識がないため分からないのですが,
教えて頂いてもよろしいでしょうか?

中山雄介

unread,
Oct 12, 2013, 11:56:11 AM10/12/13
to android-group-japan

ステップ実行をすることで正確にどこで落ちたのか、もしくは落ちた際の値が読み取れるのでバグの原因が掴みやすくなります。

2013/10/13 0:26 "清野弘洋" <armed...@gmail.com>:

清野弘洋

unread,
Oct 13, 2013, 12:30:12 AM10/13/13
to android-g...@googlegroups.com
信竹様

なるほど。
ご返信いただきありがとうございます。

Message has been deleted
Message has been deleted

minmin

unread,
Oct 13, 2013, 5:01:57 AM10/13/13
to android-g...@googlegroups.com
こんにちは。泉といいます。
僕はゲームはActivity1個でシーン遷移はViewの切り替えで作っているんですが、なぜActivity2個で作ってるんですか?

清野弘洋

unread,
Oct 13, 2013, 10:43:14 AM10/13/13
to android-g...@googlegroups.com
泉様

はじめは,私もActivity1個でやっていたのですが,
ゲームが終了した後のSurfaceViewからの遷移がうまく出来ず(setContentViewが読まれているはずなのだが遷移しない)
原因が分からなかったためSurfaceViewが邪魔してんのかな?と
思って,SurfaceViewだけ外に出そうということで,
もう一つActivityを増やしました。
Message has been deleted

清野弘洋

unread,
Oct 14, 2013, 1:20:49 AM10/14/13
to android-g...@googlegroups.com
皆様

ANRの原因が分かりました。
ゲームデータを初回起動時に
テキストファイルとして内部ストレージに書き出すのですが,
どうやら,書き出すのに時間がかかっていたようです。
ちなみに,初回起動時以外にもANRが起こっていたのは
実機テストの際に初回起動のフラグを外していたためです。
ご迷惑をおかけしました。
Reply all
Reply to author
Forward
0 new messages