如何在不挂起的情况下返回并恢复我的应用程序?
How to navigate back and resume my app without hanging it?
当我 运行 我下面的代码一切正常。当我想返回到之前的 activity(使用模拟器)时,出现黑屏,然后应用程序关闭。当我退出应用程序并尝试恢复它时,我也遇到黑屏。
代码:
package com.example.bono.as3;
import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.IOException;
import java.io.InputStream;
public class Main extends Activity {
DrawView drawView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
drawView = new DrawView(this);
setContentView(drawView);
}
@Override public void onResume(){
super.onResume();
drawView.resume();
}
@Override public void onPause(){
super.onPause();
drawView.pause();
}
public class DrawView extends SurfaceView implements Runnable{
Thread gameloop = new Thread();
SurfaceHolder surface;
volatile boolean running = false;
AssetManager assets = null;
BitmapFactory.Options options = null;
Bitmap incect[];
int frame = 0;
public DrawView(Context context){
super(context);
surface = getHolder();
assets = context.getAssets();
options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
incect = new Bitmap[2];
try {
for (int n = 0; n < incect.length; n++){
String filename = "incect"+Integer.toString(n+1)+".png";
InputStream istream = assets.open(filename);
incect[n] = BitmapFactory.decodeStream(istream,null,options);
istream.close();
}
} catch (IOException e){
e.printStackTrace();
}
}
public void resume(){
running = true;
gameloop = new Thread(this);
gameloop.start();
}
public void pause(){
running = false;
while (true){
try {
gameloop.join();
}
catch (InterruptedException e){}
}
}
@Override public void run (){
while (running){
if (!surface.getSurface().isValid())
continue;
Canvas canvas = surface.lockCanvas();
canvas.drawColor(Color.rgb(85, 107, 47));
canvas.drawBitmap(incect[frame], 0, 0, null);
surface.unlockCanvasAndPost(canvas);
frame++;
if (frame > 1) frame = 0;
try {
Thread.sleep(500);
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
}
我没有在日志中收到任何错误消息,我得到的是大约 13 条消息说 "suspending all threads took: X ms" 所以我认为这与我的 gameloop 线程有关。不幸的是,我看不出我的代码中有什么问题...
这是我用来返回的。也许这对你有用 2!
Button backpressed = (Button) findViewById(R.id.btBack);
backpressed.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
onBackPressed();
}
});
onBackPressed() 只是一个方法,如果您想 return 到最后一页,可以调用该方法。
我的看法:
如果需要上下文,请使用 getApplicationContext() 或 Activity.this。 (我的代码似乎没有那么多错误)
虽然回到以前使用过的 activity,但不会调用 onCreate(),只会调用 onResume(),因此如果您将以下行移到那里可能会有所帮助。
drawView = new DrawView(这个);
setContentView(drawView);
- 为什么要使用内部 class? Activity 已经是 class。如果您想多次使用该代码,请将其单独设为 class。
当我 运行 我下面的代码一切正常。当我想返回到之前的 activity(使用模拟器)时,出现黑屏,然后应用程序关闭。当我退出应用程序并尝试恢复它时,我也遇到黑屏。
代码:
package com.example.bono.as3;
import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.IOException;
import java.io.InputStream;
public class Main extends Activity {
DrawView drawView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
drawView = new DrawView(this);
setContentView(drawView);
}
@Override public void onResume(){
super.onResume();
drawView.resume();
}
@Override public void onPause(){
super.onPause();
drawView.pause();
}
public class DrawView extends SurfaceView implements Runnable{
Thread gameloop = new Thread();
SurfaceHolder surface;
volatile boolean running = false;
AssetManager assets = null;
BitmapFactory.Options options = null;
Bitmap incect[];
int frame = 0;
public DrawView(Context context){
super(context);
surface = getHolder();
assets = context.getAssets();
options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
incect = new Bitmap[2];
try {
for (int n = 0; n < incect.length; n++){
String filename = "incect"+Integer.toString(n+1)+".png";
InputStream istream = assets.open(filename);
incect[n] = BitmapFactory.decodeStream(istream,null,options);
istream.close();
}
} catch (IOException e){
e.printStackTrace();
}
}
public void resume(){
running = true;
gameloop = new Thread(this);
gameloop.start();
}
public void pause(){
running = false;
while (true){
try {
gameloop.join();
}
catch (InterruptedException e){}
}
}
@Override public void run (){
while (running){
if (!surface.getSurface().isValid())
continue;
Canvas canvas = surface.lockCanvas();
canvas.drawColor(Color.rgb(85, 107, 47));
canvas.drawBitmap(incect[frame], 0, 0, null);
surface.unlockCanvasAndPost(canvas);
frame++;
if (frame > 1) frame = 0;
try {
Thread.sleep(500);
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
}
我没有在日志中收到任何错误消息,我得到的是大约 13 条消息说 "suspending all threads took: X ms" 所以我认为这与我的 gameloop 线程有关。不幸的是,我看不出我的代码中有什么问题...
这是我用来返回的。也许这对你有用 2!
Button backpressed = (Button) findViewById(R.id.btBack);
backpressed.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
onBackPressed();
}
});
onBackPressed() 只是一个方法,如果您想 return 到最后一页,可以调用该方法。
我的看法:
如果需要上下文,请使用 getApplicationContext() 或 Activity.this。 (我的代码似乎没有那么多错误)
虽然回到以前使用过的 activity,但不会调用 onCreate(),只会调用 onResume(),因此如果您将以下行移到那里可能会有所帮助。 drawView = new DrawView(这个); setContentView(drawView);
- 为什么要使用内部 class? Activity 已经是 class。如果您想多次使用该代码,请将其单独设为 class。