2012-07-02 27 views
8

Như bạn có thể thấy, tôi có hoạt động PlayLesson_01 này hiển thị hình ảnh và âm thanh cùng một lúc. Hoạt động này có hai trình xử lý, một để điều khiển hình ảnh và âm thanh, trong khi người kia sẽ kết thúc bài học và quay trở lại hoạt động trước đó (Trình đơn Bài học).onBackPressed để giết người xử lý trong một hoạt động - Android

Mục tiêu: Nhấp vào nút Quay lại cứng để quay lại hoạt động trước đó và ngừng phát hình ảnh và âm thanh.

Vấn đề: Khi tôi bấm vào cứng "Back" Tôi có thể quay trở lại hoạt động trước đó, nhưng âm thanh vẫn là playing.I'm không thể dừng hoặc giết handler được khởi chạy trong hoạt động.

Câu hỏi: Làm thế nào tôi có thể giết hoặc ngăn chặn những trình xử lý đó hoàn toàn?

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Looper; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.view.animation.AnimationUtils; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemSelectedListener; 
import android.widget.BaseAdapter; 
import android.widget.Gallery; 
import android.widget.ImageSwitcher; 
import android.widget.ImageView; 
import android.widget.RelativeLayout.LayoutParams; 
import android.widget.ViewSwitcher.ViewFactory; 

public class PlayLesson_01 extends Activity implements OnItemSelectedListener, 
    ViewFactory, Runnable { 

// Setting up images 
// Keeping all Images in array references to our images 
public Integer[] mThumbIds = { R.drawable.nouraniyah, 
     R.drawable.back_angle, R.drawable.back_fox, R.drawable.back_apple, 
     R.drawable.back_twitter, R.drawable.back_thunderbird }; 
// setting up music 
int[] myMusic = { R.raw.button_3, R.raw.button_3, R.raw.button_3, 
     R.raw.button_3, R.raw.button_3, R.raw.button_3 }; 
int mNext; 
private ImageSwitcher mSwitcher; 
MediaPlayer mp; 
Handler mHandlerWholeLesson = new Handler(); 
Runnable mRunnableWholelesson = new Runnable() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     startActivity(new Intent("com.example.AmazingGame.LESSONONE")); 
    } 
}; 

Handler mHandlerNextfile = new Handler(); 
Runnable mRunnableNextFile = new Runnable() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     mp.setOnCompletionListener(mListener); 
     mp.start(); 
    } 

}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.image_switcher); // it could be lesson one 
               // layout. 

    mSwitcher = (ImageSwitcher) findViewById(R.id.imgswitcher); 
    mSwitcher.setFactory(this); 
    mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, 
      android.R.anim.fade_in)); 
    mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, 
      android.R.anim.fade_out)); 

    Gallery g = (Gallery) findViewById(R.id.gallery); 
    g.setAdapter(new ImageAdapter(this)); 
    g.setOnItemSelectedListener(this); 
    // usual onCreate stuff here, then... 
    // either here or whenever you want to start the sequence 
    mNext = 0; 
    startNextFile(); 

    // Is this good !! Yes it is. count the time for all audio. 
    mHandlerWholeLesson.postDelayed(mRunnableWholelesson, 25000); 

} 

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    startActivity(new Intent("com.example.AmazingGame.LESSONONE")); 
    System.exit(0); 
    mHandlerNextfile 
      .removeCallbacks(mRunnableNextFile, PlayLesson_01.class); 
    mHandlerWholeLesson.removeCallbacks(mRunnableWholelesson, 
      PlayLesson_01.class); 

    PlayLesson_01.this.finish(); 
} 

@Override 
protected void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
    // mHandlerNextFile.removeCallbacksAndMesssages(PlayLesson_01.class); 
} 

public void onItemSelected(AdapterView<?> parent, View v, 
     final int position, long id) { 

} 

@Override 
public void onNothingSelected(AdapterView<?> arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public View makeView() { 
    ImageView i = new ImageView(this); 
    i.setBackgroundColor(0xFF000000); 
    i.setScaleType(ImageView.ScaleType.FIT_CENTER); 
    i.setLayoutParams(new ImageSwitcher.LayoutParams(
      LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    return i; 
} 

public class ImageAdapter extends BaseAdapter { 
    public ImageAdapter(Context c) { 
     mContext = c; 
    } 

    public int getCount() { 
     return mThumbIds.length; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView i = new ImageView(mContext); 

     i.setImageResource(mThumbIds[position]); 
     i.setAdjustViewBounds(true); 
     i.setLayoutParams(new Gallery.LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
     i.setBackgroundResource(R.drawable.picture_frame); 
     return i; 
    } 

    private Context mContext; 

} 

OnCompletionListener mListener = new OnCompletionListener() { 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     mp.release(); 
     startNextFile(); 
    } 
}; 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    this.finish(); 

} 

public void startNextFile() { 

    if (mNext < myMusic.length) { 

     mp = MediaPlayer.create(this, myMusic[mNext]); 
     mSwitcher.setImageResource(mThumbIds[mNext++]); 
     mHandlerNextfile.postDelayed(mRunnableNextFile, 3000); 
    } 

} 

@Override 
public void run() { 
    // TODO Auto-generated method stub 

} 

}

Trả lời

42

Hiện nay có vài điều sai trái trong mã của bạn:

  1. Nếu bạn muốn quay trở lại hoạt động trước đó của bạn, bạn không chạy lại sử dụng một startActivity như hành vi mặc định của Android là nó duy trì một chồng các hoạt động trước đó. Trên báo chí của back nó sẽ theo mặc định trở lại hoạt động trước đó (trừ khi bạn đã khởi chạy hoạt động con bằng cách sử dụng một số cờ.)

  2. Tại sao bạn sử dụng System.exit(0); trên báo chí? Bạn chỉ cần gọi số finish() để hoàn thành hoạt động hiện tại.

  3. Cách tốt nhất để xóa cuộc gọi lại từ trình xử lý đang sử dụng thông số null làm tham số. Bạn có thể thử mã sau:

    mHandlerNextfile.removeCallbacksAndMessages(null); 
    mHandlerWholeLesson.removeCallbacksAndMessages(null); 
    

    vì điều này sẽ xóa tất cả các cuộc gọi lại. Kiểm tra liên kết này để biết thêm: http://developer.android.com/reference/android/os/Handler.html#removeCallbacksAndMessages(java.lang.Object)

+0

Cảm ơn. Nó hoạt dộng bây giờ. Tôi đã thay đổi cả hai tham số trình xử lý thành "null". Tôi lấy ra System.exit (0). – Jawwalcom

+0

handler.removeCallbacksAndMessages (null); thật tuyệt vời để xóa tất cả trình xử lý. –

+0

ghi đè lên phương thứcDestroy() và gọi mp.release() để dừng phát lại. – SHB

0

Trình xử lý của bạn không "chạy", trình phát đa phương tiện của bạn. Chỉ cần gọi mp.stop() trong onBackPressed().

Ngoài ra, những gì Arun George nói.

+0

Thêm ** mp.stop() ** in ** onBackPressed ** không hoạt động. Nó ném lỗi MediaPalyer (-38,0). – Jawwalcom

+0

với một vài thay đổi. Nó đã hoạt động. Tôi đã thêm ** mp.stop() ** vào ** OnBackPressed ** – Jawwalcom

+0

nó sẽ là mp.release() – SHB

Các vấn đề liên quan