2011-03-11 117 views
1

我已經創建了一個圖像編輯應用程序..它由兩個活動組成,主要活動導致下一個活動。一切工作正常。問題是,當我在第二個活動中按HOME鍵時,它現在跳到主屏幕,當我再次運行應用程序時,它會生成一個錯誤以強制關閉。這在第一次活動期間沒有發生。我無法找到確切的問題.. 有什麼辦法,如果用戶按HOME鍵,我可以殺死該活動?按Home鍵觸發錯誤

下面

是surfaceview我使用的代碼......它也使用線程...我想逸也正是DIS prblem正在興起... u能請您檢查出DIS

public DrawingSurface(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    getHolder().addCallback(this); 

    commandManager = new CommandManager(); 
    da=new DrawingActivity(); 
    thread = new DrawThread(getHolder()); 
} 


class DrawThread extends Thread{ 
    private SurfaceHolder mSurfaceHolder; 


    public DrawThread(SurfaceHolder surfaceHolder){ 
     mSurfaceHolder = surfaceHolder; 

    } 

    public void setRunning(boolean run) { 
     _run = run; 
    } 


    @Override 
    public void run() { 
     Canvas canvas = null; 
     b=da.getpic(); 

     while (_run){ 
      try{ 
       canvas = mSurfaceHolder.lockCanvas(null); 
       if(mBitmap == null){ 
        mBitmap = Bitmap.createBitmap (1, 1, Bitmap.Config.ARGB_8888);; 
       } 
       final Canvas c = new Canvas (mBitmap); 


       c.drawBitmap(b, 0, 0, null); 
       commandManager.executeAll(c); 

       canvas.drawBitmap (mBitmap, 0, 0,null); //first block 

      } finally { 
       mSurfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 

    } 


} 


public void addDrawingPath (DrawingPath drawingPath){ 
    commandManager.addCommand(drawingPath); 
} 

public boolean hasMoreRedo(){ 
    return commandManager.hasMoreRedo(); 
} 

public void redo(){ 
    commandManager.redo(); 
} 

public void undo(){ 
    commandManager.undo(); 
} 

public boolean hasMoreUndo(){ 
    return commandManager.hasMoreRedo(); 
} 
public Bitmap getBitmap(){ 

    return mBitmap; 
} 


public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

    mBitmap = Bitmap.createBitmap (width, height, Bitmap.Config.ARGB_8888); 

} 

public void surfaceCreated(SurfaceHolder holder) { 

    thread.setRunning(true); 
    thread.start(); 

} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    boolean retry = true; 
    thread.setRunning(false); 
    while (retry) { 
     try { 
      thread.join(); 
      retry = false; 
     } catch (InterruptedException e) { 

     } 
    } 
} 
+1

這可能有這麼多的具體原因,所以你應該張貼的例外是拋出和一些代碼。從那個描述中不可能回答它。 – Chris 2011-03-11 13:41:17

回答

-3

嘗試該產品按鍵

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     Intent i = new Intent(); 
     i.setClass(Activity1.this, Activity2.class); 
     i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(i); 

     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+0

HOME KEY如何與KEYCODE_BACK關聯!我認爲這是爲BACK btn! – sat 2011-03-11 13:45:44

+0

按HOME不會觸發onKeyDown – 2012-01-31 21:28:51

0

在您的活動將這個殺人的HOME按鍵

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_HOME) { 
     android.os.Process.killProcess(android.os.Process.myPid()); 
    } 
    return true; 
} 

應用奇怪的是,即使BACK按鈕也不會退出它。

+0

thnx的答案,但它不工作......是有關表面視圖和線程..? – user632905 2011-03-12 06:52:36

+0

你的意思是什麼不起作用?你的環境是什麼? – 2011-03-12 11:17:50

+0

它沒有工作,因爲你無法檢測到家庭按鍵事件.. – user632905 2011-07-22 12:25:07

0

讓我們知道當您將應用程序置於前臺時您會得到什麼異常。

發生這種情況時,您尚未重新初始化某些對象或變量。

您需要在onPause()方法中將共享首選項中變量的值保存爲空值。您可以從SharedPrefs中獲取這些值,並將它們分配回變量,或重新創建onResume()方法中爲空的對象。

當Android在低內存上運行時,它在應用程序轉到後臺時會殺死一些活動或清除一些變量和對象。爲什麼你要好好照顧它,在的onPause()和的onResume()NMETHODS那...

希望它可以幫助...