2016-08-15 10 views
-5

[это представление списка песен, присутствующих в сд карте ][1]Почему мой крах программы, когда я нажимаю кнопку назад

**** Вот мой код MainActivity ****

package com.example.jawad.musicplayer; 

import android.content.Intent; 
import android.media.MediaPlayer; 
import android.os.Environment; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.Toast; 

import java.io.File; 
import java.util.ArrayList; 

public class MainActivity extends AppCompatActivity implements View.OnClickListener 
{ 

    ListView musicListView; 
    ArrayList<File> musicFiles; 
    MediaPlayer mediaplayer; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     musicListView = (ListView) findViewById(R.id.musiclistviewId); 
     musicFiles = findSongs(Environment.getExternalStorageDirectory()); 
     CustomListViewAdapter CLV = new CustomListViewAdapter(MainActivity.this,R.layout.list_row,musicFiles); 
     musicListView.setAdapter(CLV); 
     musicListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       startActivity(new Intent(MainActivity.this,PlayerActivity.class).putExtra("music",musicFiles).putExtra("pos",position)); 
      } 
     }); 

     /*for (int i =0 ;i < music.size();i++) 
     { 
      toast(music.get(i).getName().toString()); 
     }*/ 

    } 

    public ArrayList<File> findSongs(File root) 
    { 
     File[] files = root.listFiles(); 
     ArrayList<File> tempSongs = new ArrayList<>(); 
     for(File singlefile : files) 
     { 
      if(singlefile.isDirectory() && !singlefile.isHidden()) 
      { 
       tempSongs.addAll(findSongs(singlefile)); 
      } 
      else 
      { 
       if(singlefile.getName().endsWith(".mp3")) 
       { 
        tempSongs.add(singlefile); 
       } 
      } 
     } 
      return tempSongs; 
    } 

    public void toast(String text) 
    { 
     Toast.makeText(getApplicationContext(),text,Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onClick(View v) { 

    } 
} 

а вот код «Player» активность

package com.example.jawad.musicplayer; 

import android.media.MediaPlayer; 
import android.net.Uri; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.SeekBar; 
import android.widget.Toast; 

import java.io.File; 
import java.util.ArrayList; 

public class PlayerActivity extends AppCompatActivity implements View.OnClickListener 
{ 

    Button playButton; 
    MediaPlayer mplayer; 
    private Button prevButton; 
    private Button nextButton; 
    SeekBar sb; 
    Thread updateThread; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_player); 
     playButton = (Button) findViewById(R.id.playButtonId); 
     prevButton=(Button) findViewById(R.id.prevButtonId); 
     nextButton = (Button) findViewById(R.id.nextButtonId); 
     sb = (SeekBar) findViewById(R.id.seekbarId); 



     playButton.setOnClickListener(this); 
     nextButton.setOnClickListener(this); 
     prevButton.setOnClickListener(this); 

     Bundle extra = getIntent().getExtras(); 
     if(extra!=null) { 
      ArrayList<File> list = (ArrayList) extra.getParcelableArrayList("music"); 
      int pos = extra.getInt("pos"); 
      File file = list.get(pos); 
      // Toast.makeText(getApplicationContext(),file.getName().toString(),Toast.LENGTH_LONG).show(); 

      Uri URI = Uri.parse(file.toString()); 
      mplayer=MediaPlayer.create(getApplicationContext(),URI); 

     } 
    } 

    @Override 
    public void onClick(View v) { 
     int id =v.getId(); 
     switch(id) 
     { 
      case R.id.playButtonId: 
       if(mplayer.isPlaying()) 
        pauseMusic(); 
       else 
        playMusic(); 
       break; 
      case R.id.prevButtonId: 
       break; 
      case R.id.nextButtonId: 
       break; 
     } 
    } 

    public void playMusic() 
    { 

     if(mplayer!= null) { 
      mplayer.start(); 
      playButton.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.ic_media_pause)); 
      updateThread = new Thread() { 
       @Override 
       public void run() 
       { 
        sb.setMax(mplayer.getDuration()); 
        int toatalduration = mplayer.getDuration(); 
        int currentposition = 0; 
        while (currentposition < toatalduration && mplayer.isPlaying()) 
        { 
         try 
         { 
          sleep(500); 
          currentposition = mplayer.getCurrentPosition(); 
          sb.setProgress(currentposition); 
         } 
         catch (InterruptedException e) 
         { 
          e.printStackTrace(); 
         } 

        } 
       } 


      }; 
     } 
      updateThread.start(); 


    } 


    @Override 
    public void onBackPressed() { 
     updateThread.stop(); 
     onDestroy(); 
    } 

    public void pauseMusic() 
    { 
     if (mplayer!=null) 
     { 
      mplayer.pause(); 
      playButton.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.ic_media_play)); 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     if(mplayer!=null && mplayer.isPlaying()) 
     { 
      mplayer.stop(); 
      mplayer.release(); 
      mplayer = null; 
      super.onDestroy(); 
     } 
    } 
} 

в основном я новичок в программирование андроида и практикуя встроенный медиа-плеер в android.I имеет хорошее сцепление с дорогой над Java, но до сих пор я не смог е в решении этой проблемы, поэтому ваша помощь будет приветствоваться. Я также переопределил метод onBackPressed(), и в этом методе я остановил поток и остановил музыкальный проигрыватель, но все же андроид-студия дал мне ошибку.

Вот мой LogCat:

08-15 14:11:00.721 1429-1429/com.example.jawad.musicplayer E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.jawad.musicplayer, PID: 1429 
android.util.SuperNotCalledException: Activity {com.example.jawad.musicplayer/com.example.jawad.musicplayer.PlayerActivity} did not call through to super.onDestroy() 
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3472) 
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3501) 
at android.app.ActivityThread.access$1400(ActivityThread.java:135) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1249) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:136) 
at android.app.ActivityThread.main(ActivityThread.java:5001) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
at dalvik.system.NativeStart.main(Native Method) 
08-15 14:11:00.721 534-760/system_process W/ActivityManager: Force finishing activity com.example.jawad.musicplayer/.MainActivity 

[08-15 14:11:00.741 534: 760 D/] HostConnection::get() New Host Connection established 0xb7cbc840, tid 760 
+11

Читали ли вы ошибку? "android.util.SuperNotCalledException: Activity {com.example.jawad.musicplayer/com.example.jawad.musicplayer.PlayerActivity} ** не перешел в super.onDestroy() **" – resueman

+2

Я действительно предлагаю вам (и другие новые пользователи) сначала используйте отладчик и попытайтесь сделать шаг, чтобы ** изолировать вашу проблему и посмотреть, что конкретно об этом **, а не приходить сюда и делать массивный дамп кода/logcat. – Jeeter

+0

Никогда не вызывайте 'Thread.stop()'. – shmosel

ответ

0

Try ниже код:

@Override 
protected void onDestroy() { 
    if(mplayer!=null && mplayer.isPlaying()) 
    { 
     mplayer.stop(); 
     mplayer.release(); 
     mplayer = null; 
    } 
    super.onDestroy(); 
} 
Смежные вопросы