0

이 어댑터는 버튼 클릭시 음악을 재생합니다. 이미 멈추기 위해 연주중인 노래를 클릭하면 앱이 모두 작동합니다. 누군가 이걸 가지고 나를 도울 수 있습니까? 저는 지금 2 시간 동안 알아 내려고 노력하고 있습니다. 여기 동일한 항목을 클릭하면 응용 프로그램이 충돌 함

가 내 어댑터 여기

public class DownloadsDetailsAdapter extends BaseAdapter { 
    private Activity activity; 
    private ArrayList<Songs> data; 
    private static LayoutInflater inflater = null; 
    private MediaPlayer mediaPlayer; 
    private ImageView playSong; 
    private String id; 
    private DatabaseHelper helper; 
    private ImageLoader loader; 
    private int oldPosition = -1; 
    private AsyncTask<Void, Void, Void> task; 
    Handler handler = new Handler(); 

    public DownloadsDetailsAdapter(Activity a, ArrayList<Songs> songs, String id) { 
     activity = a; 
     data = songs; 
     this.id = id; 
     loader = new ImageLoader(a); 
     mediaPlayer = new MediaPlayer(); 
     inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public int getCount() { 
     return data.size(); 
    } 

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

    public void stopMusic() { 
     try { 
      mediaPlayer.stop(); 
      if (task.isCancelled() == false) 
       task.cancel(true); 
      playSong.setBackgroundResource(R.drawable.play_nr); 
     } catch (Exception e) { 
     } 
    } 

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

    public View getView(final int position, View convertView, ViewGroup parent) { 
     View vi = convertView; 
     if (convertView == null) 
      vi = inflater.inflate(R.layout.downloads_details_item, parent, 
        false); 
     helper = new DatabaseHelper(activity); 
     helper.openDB(); 
     TextView songNumber = (TextView) vi 
       .findViewById(R.id.down_songs_item_number); 
     TextView albumTitle = (TextView) vi 
       .findViewById(R.id.down_songs_item_album_title); 
     TextView singer = (TextView) vi 
       .findViewById(R.id.down_songs_item_album_singer); 
     ImageView deleteSong = (ImageView) vi 
       .findViewById(R.id.down_songs_item_del); 
     ImageView thumb = (ImageView) vi 
       .findViewById(R.id.down_songs_item_thumb); 
     TextView feat = (TextView) vi 
       .findViewById(R.id.down_songs_item_album_feat); 

     loader.DisplayImage(data.get(position).getSONG_THUMB(), thumb); 
     playSong = (ImageView) vi.findViewById(R.id.down_songs_item_download); 
     if (!data.get(position).getIsPlaying()) 
      playSong.setBackgroundResource(R.drawable.play_downloaded_album); 
     else 
      playSong.setBackgroundResource(R.drawable.stop); 
     albumTitle.setText(data.get(position).getSONG_TITLE()); 
     singer.setText(data.get(position).getSONG_ARTIST()); 
     // feat.setText(data.get(position).getFeat()); 
     // if(data.get(position).getFeat().length()<=1) 
     feat.setVisibility(View.GONE); 
     songNumber.setText(position + 1 + ""); 
     if (!data.get(position).getSONG_MP3() 
       .equals("http://nelu.burduja.com/musica/songs_with/")) { 

      deleteSong.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View arg0) { 
        if (!helper.isDBOpen()) { 
         helper.openDB(); 
        } 
        DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 

          switch (which) { 
          case DialogInterface.BUTTON_POSITIVE: 
           if (!helper.isDBOpen()) { 
            helper.openDB(); 
           } 
           helper.removeDownloadedSong(id, 
             data.get(position).getSONG_TITLE()); 
           helper.removeSharedSong(data.get(position) 
             .getSONG_TITLE(), id); 
           File file = new File(data.get(position) 
             .getSONG_MP3()); 
           file.delete(); 
           if (helper.getDownloadedSongsForAlbum(id) 
             .size() < 1) { 
            helper.removeDownloadedAlbum(id); 
           } 
           Toast.makeText(activity, R.string.song_deleted, 
             Toast.LENGTH_SHORT).show(); 
           helper.closeDB(); 
           break; 

          case DialogInterface.BUTTON_NEGATIVE: 
           dialog.dismiss(); 
           break; 
          } 
         } 
        }; 
        AlertDialog.Builder builder = new AlertDialog.Builder(
          activity); 
        builder.setMessage(R.string.are_you_sure) 
          .setPositiveButton(R.string.yes, 
            dialogClickListener) 
          .setNegativeButton(R.string.no, dialogClickListener) 
          .show(); 
        helper.closeDB(); 

       } 

      }); 

      playSong.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        final ProgressDialog bufferingDialog = new ProgressDialog(
          activity); 
        // ((DownloadedDetails) activity).changePicToPlay(position); 
        if (task != null && mediaPlayer != null) { 
         task.cancel(true); 
         mediaPlayer.release(); 
         if (oldPosition != -1) { 
          ((DownloadedDetails) activity) 
            .changePicToPlay(oldPosition); 
         } 

        } 

        if (position != oldPosition) { 
         ((DownloadedDetails) activity) 
           .changePicToPlay(position); 
         task = new AsyncTask<Void, Void, Void>() { 
          @Override 
          protected void onPreExecute() { 
           bufferingDialog.setMessage(activity 
             .getString(R.string.buffering)); 
           bufferingDialog.show(); 
           super.onPreExecute(); 
          } 

          @Override 
          protected Void doInBackground(Void... params) { 

           try { 
            mediaPlayer = new MediaPlayer(); 
            mediaPlayer.setDataSource(data 
              .get(position).getSONG_MP3()); 
            mediaPlayer.prepare(); 
            mediaPlayer.start(); 
            // handler.post(new Runnable() { 
            // 
            // @Override 
            // public void run() { 
            // ((DownloadedDetails) activity) 
            // .changePicToPlay(position); 
            // } 
            // }); 
           } catch (IllegalStateException e) { 
            e.printStackTrace(); 

           } catch (IOException e) { 

            bufferingDialog.dismiss(); 
            ((DownloadedDetails) activity) 
            .changePicToPlay(position); 
            handler.post(new Runnable() { 
             @Override 
             public void run() { 
//           ((DownloadedDetails) activity) 
//             .changePicToPlay(position); 
              Toast.makeText(activity, 
                "Song not existing", 
                Toast.LENGTH_SHORT).show(); 
             } 
            }); 

            e.printStackTrace(); 
           } 

           return null; 
          } 

          @Override 
          protected void onPostExecute(Void result) { 
           if (bufferingDialog.isShowing()) 
            bufferingDialog.dismiss(); 
           super.onPostExecute(result); 
          } 
         }; 
         task.execute(); 
        } else { 
         if (data.get(position).getIsPlaying()==false) { 
          Log.v("--", "test0"); 
          task = new AsyncTask<Void, Void, Void>() { 
           @Override 
           protected void onPreExecute() { 

            super.onPreExecute(); 
           } 

           @Override 
           protected Void doInBackground(Void... params) { 

            try { 
             mediaPlayer = new MediaPlayer(); 
             mediaPlayer.setDataSource(data.get(
               position).getSONG_MP3()); 
             mediaPlayer.prepare(); 
             mediaPlayer.start(); 
             ((DownloadedDetails) activity) 
                 .changePicToPlay(position); 
             handler.post(new Runnable() { 

              @Override 
              public void run() { 

              } 
             }); 
//          mediaPlayer.setOnCompletionListener(new OnCompletionListener() { 
//           
//           @Override 
//           public void onCompletion(MediaPlayer mp) { 
//            ((DownloadedDetails) activity) 
//            .changePicToPlay(position); 
//           } 
//          }); 

            } catch (IllegalStateException e) { 
             e.printStackTrace(); 

            } catch (IOException e) { 
             ((DownloadedDetails) activity) 
             .changePicToPlay(position); 
             handler.post(new Runnable() { 
              @Override 
              public void run() { 

               Toast.makeText(activity, 
                 "Song not existing", 
                 Toast.LENGTH_SHORT) 
                 .show(); 
               stopMusic(); 
              } 
             }); 
            } 

            // mediaPlayer.start(); 
            return null; 
           } 

           @Override 
           protected void onPostExecute(Void result) { 

            super.onPostExecute(result); 
           } 
          }; 
          task.execute(); 
         } else { 
          Log.v("--", "test1"); 
          task.cancel(false); 
          ((DownloadedDetails) activity) 
          .changePicToPlay(position); 
          handler.post(new Runnable() { 

           @Override 
           public void run() { 
            playSong.setBackgroundResource(R.drawable.play_downloaded_album); 

            Log.v("--", "test2"); 
           } 
          }); 
          Log.v("--", "test3"); 
         } 
        } 
        oldPosition = position; 
       } 
      }); 
     } 
     helper.closeDB(); 
     return vi; 
    } 
} 

입니다 로그 고양이 : 여기

09-06 00:55:23.593: E/AndroidRuntime(15814): FATAL EXCEPTION: AsyncTask #5 
09-06 00:55:23.593: E/AndroidRuntime(15814): java.lang.RuntimeException: An error occured while executing doInBackground() 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.os.AsyncTask$3.done(AsyncTask.java:278) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at java.lang.Thread.run(Thread.java:856) 
09-06 00:55:23.593: E/AndroidRuntime(15814): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4056) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:709) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.view.View.requestLayout(View.java:12833) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.view.View.requestLayout(View.java:12833) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.view.View.requestLayout(View.java:12833) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.view.View.requestLayout(View.java:12833) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:273) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.view.View.requestLayout(View.java:12833) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.widget.AbsListView.requestLayout(AbsListView.java:1697) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:801) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.widget.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:5613) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:35) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at com.outsourcefarm.musicagratis.activities.DownloadedDetails.changePicToPlay(DownloadedDetails.java:151) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at com.outsoucefarm.musicagratis.functions.DownloadsDetailsAdapter$2$2.doInBackground(DownloadsDetailsAdapter.java:258) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at com.outsoucefarm.musicagratis.functions.DownloadsDetailsAdapter$2$2.doInBackground(DownloadsDetailsAdapter.java:1) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
09-06 00:55:23.593: E/AndroidRuntime(15814): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
09-06 00:55:23.593: E/AndroidRuntime(15814): ... 5 more 

그리고 앨범 정보가 나는 당신의 오류가 여기에서 온다 생각

public void changePicToPlay(int position) { 
     songs.get(position).togglePlaying(); 
     adapter.notifyDataSetChanged(); 
    } 

답변

0

151 라인이다 doInBackground()

 handler.post(new Runnable() { 
             @Override 
             public void run() { 
//           ((DownloadedDetails) activity) 
//             .changePicToPlay(position); 
              Toast.makeText(activity, 
                "Song not existing", 
                Toast.LENGTH_SHORT).show(); 
             } 

AsyncTask으로 Handler, Thread 등을 사용할 필요가 없습니다.이 모든 방법을 사용하는 방법이 있습니다. 사용 방법은 AsyncTask을 사용하십시오. 당신이 당신의 doInBackground에서 UI 요소를 넣을 수 없습니다 때문에 오류가 점점 당신의 Toast

0

보여 onPostExecute()에 값을 여기 onProgressUpdate() 전화하거나 반환하는 publishProgress()()를 사용합니다. 나는 깊이 당신이 할 얼마나 많은 시간을 분석하지 않은,하지만 첫 눈에 난 이미 당신의 doInBackground() 메소드에서이 줄을 발견

bufferingDialog.dismiss(); 
당신은 당신의 onPostExecute()에서 기각되어야한다

doInBackground()에서 크런치 만 발생해야합니다. 모든 UI는 ASyncTask의 onPreExecute 및 onPostExecute에서 발생해야합니다.

+0

변경되었습니다. 이제 다른 오류가 발생합니다. –

+0

다른 오류는 무엇입니까? doInBackground() 메서드에서 더 많은 UI 호출을 보았습니다. 화면에서 볼 수있는 경우 doInBackground()에 속하지 않습니다. 나는 오디오를 많이 사용하지 않았지만 같은 규칙이 적용될 수있다. 게시 할 때 코드를 업데이트 할 수 있습니까? –

관련 문제