android高級開発エンジニア面接問題

9256 ワード

1、Androidアプリケーションの性能分析方法1)app製品が完成したら、各コントロールから国内の異なる携帯電話ブランドと異なるシステムバージョンで互換性テストを行わなければならない.業界内でも遍歴テストと呼ばれている.遍歴テストとは、アプリケーションを識別できるコントロールを移動して多層の運行テストを行うことであり、その中にインストールテスト、起動テスト、コントロール遍歴テスト、最後にアンロードテストが含まれている.2)互換性テスト、すなわち適合テストが完了した後、ネットワーク性能のテストを開始する必要があります.ここでは、ネットワーク性能テスト、要素ロード性能テスト、ネットワーク可用性テストなど、いくつかの面で行う必要があります.国内の既存のテストサイクルとテスト手段はすべて人工化テストを通じて、本当に自動化を実現して時間と人力を節約するのは第三者の応用性能管理プロバイダを借りてこそ実現することができる.2、どのような場合にメモリ漏洩を引き起こすか1)Contextの使用が不適切でメモリ漏洩をもたらす.Activity Contextに対して長寿命期間の参照を保持しないでください(たとえば、上記の概念セクションで示した例).Contextの代わりにApplicationContextを使用できるすべての場所で置き換える2)非静的内部クラスの静的インスタンスはメモリ漏れを起こしやすい.すなわち、クラス内の内部クラスのライフサイクル(Activityの特殊なHandlerなど)を制御できない場合は、できるだけ静的クラスと弱引引を使用して処理します(例えば、ViewRootの実装).3)スレッドが終了していないことによるメモリの漏洩を警戒する.例えばActivityにはActivityを超えるThreadが1ライフサイクル関連付けられており、Activityを終了するときに終了スレッドを覚えておく.1つの典型的な例はHandlerThreadのrun法はデッドサイクルであり、それは自分で終わることはなく、スレッドのライフサイクルはActivityライフサイクルを超えており、Activityの破棄方法で手動でthreadを転送しなければならない.getLooper().quit();漏らさない.4)対象者の登録と逆登録は対になってメモリ漏れが発生していない;例えば、ブロードキャスト受信機の登録、観察者の登録(典型的には、データベースの傍受など)などである.5)作成と閉鎖はペアによる漏洩が発生していない.たとえば、Cursorリソースは手動で閉じる必要があり、WebViewは手動で破棄する必要があり、ストリームなどのオブジェクトは手動で閉じる必要があります.6)実行頻度の高い方法やループでオブジェクトを作成するのではなく、newやリリースのたびにオブジェクトを取り出すのではなく、HashTableなどを使用してオブジェクトコンテナのセットを作成することができます.7)コード設計モードのエラーによるメモリ漏洩を避ける.3、OOM異常を避ける方法1)画像が大きすぎると、OOM Androidでbitmapを使うとメモリが溢れやすくなります.例えば、Java.lang.OutOfMemoryError : bitmap size exceeds VM budget. 解決方法:方法1:等比例縮小画像
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
//Options          ,        
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 2;
Bitmap bmp = null;
bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts);
//  
bmp.recycle();//
以上のコードはメモリオーバーフローを最適化できますが、画像のサイズを変更するだけで、メモリオーバーフローを完全に解決することはできません.方法2:画像にソフトリファレンスを採用し、タイムリーにrecyle()操作を行う
SoftReference bitmap = new SoftReference(pBitmap);
if(bitmap != null){
    if(bitmap.get() != null && !bitmap.get().isRecycled()){
    bitmap.get().recycle();
    bitmap = null;
    }
}
方法3:ロードピクチャフレームワークを用いてピクチャを処理し、例えばロードピクチャを専門的に処理するImageLoaderピクチャロードフレームワーク.私たちが学んだXUtilsのBitMapUtilsも処理しています.2)インタフェースの切り替えによりOOMが発生するのは一般的に,開発中は横画面が禁止される.往復切替であればactivityのライフサイクルが再破棄されて作成されるからです.時にはこのような問題を発見することができて、縦スクリーンをN回切り替えた後にOOMになりました.この問題には固定的な解決方法はないが,以下のいくつかの面から分析することができる.1、ページレイアウトに大きな画像があるかどうか、背景図などを見てみましょう.xmlの関連する設定を削除し、プログラムで背景図を設定する(onCreate()メソッドに置く):
Drawable drawable = getResources().getDrawable(R.drawable.id);
ImageView imageView = new ImageView(this);
imageView.setBackgroundDrawable(drawable);
Activity destoryではdrawable.setCallback(null); Activityがタイムリーにリリースされないことを防止します.2、上記の方法と同様に、xmlプロファイルをviewにロードしてコンテナに入れ、thisを直接呼び出す.setContentView(View view);xmlの重複ロードを回避する方法.3、ページ切り替えの際には、データベースの呼び出しを繰り返したり、オブジェクトの使用を繰り返したり…3、クエリー・データベースがシャットダウンされていないカーソル・プログラムではクエリー・データベースの操作が頻繁に行われますが、Cursorを使用した後にシャットダウンされないことがよくあります.クエリ結果セットが比較的小さい場合、メモリの消費量が発見されにくく、メモリの問題が発生するのは、通常の時間に大量に操作されている場合に限られます.これにより、今後のテストと問題のトラブルシューティングに困難とリスクが発生します.4、Adapterを構築する場合、キャッシュを使用していないconvertViewはListViewを使用する場合、通常Adapterを使用します.では、できるだけConvertViewを使用する必要があります.なぜconvertViewを使うのですか?convertViewが空の場合、setTag()メソッドを使用して、各Viewに対してコントロールを格納するViewHolderオブジェクトをバインドします.convertViewが空ではなく、作成したviewを再利用する場合、getTag()メソッドを使用してバインドされたViewHolderオブジェクトを取得することで、findViewByIdによるコントロールの階層クエリーを回避し、コントロールに迅速にナビゲートできます.5、Bitmapオブジェクトが使用されなくなったときにrecycle()を呼び出してメモリを解放するとき、Bitmapオブジェクトを手動で操作することがあります.Bitmapオブジェクトがメモリを占有する場合、使用されなくなったときにBitmapを呼び出すことができます.recycle()メソッドは、このオブジェクトのピクセルが消費するメモリを回収しますが、これは必要ではありません.状況によって異なります.6、その他のAndroidアプリケーションの中で最も典型的な注意が必要なのは、Activityのライフサイクルにおいて、onPause()、onStop()、onDestroy()メソッドにおいて適切なリソースの解放が必要な場合である.ブロードキャストを使用してログアウトしなくてもOOMが発生します.4、Androidで未キャプチャの例外をどのようにキャプチャするか1)まずクラスを定義し、CrashHandlerと名付け、インタフェースjavaを実現する.lang.Thread.UncaughtException(Thread t,Throwable)メソッドを実装するには、この関数では、sdcard上のどこかに異常情報を保存したり、ユーザーに異常が発生したことを提示したりするなど、いくつかの処理を行うことができます.コード:
/**
 * crash  log  
 *     log    sdcard   
 * @author qizhenghao
 */
public class CrashHandler implements UncaughtExceptionHandler {
    private static CrashHandler instance;
    private Context context;
    /**      UncaughtException    */
    private Thread.UncaughtExceptionHandler defaultHandler;

    //   
    public static CrashHandler getInstance() {
        if (instance == null) {
            instance = new CrashHandler();
        }
        return instance;
    }

    //    
    public void init(Context context) {
        this.context = context;
        defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    @Override
    public void uncaughtException(Thread arg0, Throwable arg1) {
        DownloadManager.getInstance().clearNotification();
        if (!handleException(arg1) && defaultHandler != null) {
            //                        
            defaultHandler.uncaughtException(arg0, arg1);
        } else {
            //     
            System.exit(16);
        }
    }

    //     
    private boolean handleException(Throwable ex) {
        if (ex == null) {
            return true;
        }
        ex.printStackTrace();
        //  log       
        Methods.logCrashOnFile(context, ex);

        //   1s
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //     
        int nPid = android.os.Process.myPid();
        android.os.Process.killProcess(nPid);

        return true;
    }
そのうちsetDefaultUncaughtExceptionHandler(this);最も重要なコードです.次に、アプリケーションのonCreate()メソッドに登録します.
public class ExcApplication extends Application {
    @Override
    public void onCreate() {
        CrashHandler.getInstance().init(getApplicationContext());
    }
}
2)第三者サービス例:友盟