2

SurfaceView クラスを作成した単純なアプリケーションがあり、メイン アクティビティでクラスのオブジェクトを作成し、この SurfaceView を相対レイアウトに追加し、コンテンツ ビューを相対レイアウトに設定しました。

package com.my.game;
import com.google.ads.Ad;
import com.google.ads.AdListener;
import com.google.ads.AdRequest;
import com.google.ads.AdRequest.ErrorCode;
import com.google.ads.AdSize;
import com.google.ads.AdView;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.widget.RelativeLayout;

public class ShootLetters extends Activity {

    private Panel panel;
    private int newWidth;
    private int newHeight;

    private AdView adView;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bitmap bg = BitmapFactory.decodeResource(this.getResources(),
                R.drawable.shooting_background);
        ;

        int width = bg.getWidth();
        int height = bg.getHeight();

        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);

        newWidth = metrics.widthPixels;

        newHeight = metrics.heightPixels;
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // CREATE A MATRIX FOR THE MANIPULATION
        Matrix matrix = new Matrix();
        // RESIZE THE BIT MAP
        matrix.postScale(scaleWidth, scaleHeight);

        Bitmap resizedBackGround = Bitmap.createBitmap(bg, 0, 0, width, height,
                matrix, false);

        Window win = getWindow();
        Drawable d = new BitmapDrawable(resizedBackGround);
        win.setBackgroundDrawable(d);

        panel = new Panel(this, newWidth, newHeight);

        panel.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    panel.setClickX(event.getX());
                    panel.setClickY(event.getY());
                }
                return true;
            }

        });

        adView = new AdView(this, AdSize.BANNER, "admobidxxx222");

        RelativeLayout rl = new RelativeLayout(this);
        rl.addView(panel);
        rl.addView(adView);

        setContentView(rl);

        // Initiate a generic request to load it with an ad
        adView.loadAd(new AdRequest());
    }

    @Override
    public void onDestroy() {
        if (adView != null) {
            adView.destroy();
        }
        panel.stopThread();
        panel = null;

        super.onDestroy();
    }

}

これは、アプリケーションの開始と停止に問題なく機能します。

問題は、別のアクティビティがこのアクティビティの上に来ると、不安定な方法で動作することです (この段階では詳細は必要ありません。クラッシュすることもあれば、欠落したレイアウト オブジェクトで動作することもあります)。

onPause()これを処理するには&onResume()メソッドを実装する必要があることを読みました。アクティビティを一時停止するか、再開時に再開するだけです。永続的なデータは必要ありません。

この場合、どのメソッドに何を入れる必要がありますか?

ありがとう

4

1 に答える 1

1

それはあなたのサーフェスビューだと思いますPanelか?onDestroy のスレッドで何かを行っているようですが、それだけでは不十分です。あなたは実装について正しい予感を持っていましたが、onPause()onResume()の考えでは (すべてのコードを見ることができません)、スレッドを正しく扱っていないということです。surfaceview を拡張する Panel クラスには、次の 2 つの関数のようなものが必要です。

    public void pause(){
        Loop = false;
        while (true){
            try{
                panelThread.join();//end it
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            break;
        }
        panelThread = null;
    }
    public void resume(){
        Loop = true;
        panelThread = new Thread(this);
        panelThread.start();
    }

メソッドでループを使用していない場合は、ループ部分を無視してくださいrun()

次に、アクティビティのonPause()andonResume()メソッドで、それぞれpanel.pause()andを呼び出しpanel.resume()ます。これにより、サーフェス ビュー スレッドが安全な方法で処理されるようになります。

于 2012-07-24T06:29:38.947 に答える