2017-02-13 16 views
2

Каждый раз, когда отображается AlertDialog, приложение закрыто или уничтожено. Я получаю эту ошибку в logcat has leaked window. Я знаю, что при использовании метода onDestroy() ниже удаляется эта ошибка, но это работает только в том случае, если внутри операции находится AlertDialog. Однако в моем случае я использую AlertDialog внутри адаптера, который показан на коде нижеотклонить AlertDialog внутри адаптера при закрытии приложения

@Override 
public void onDestroy(){ 
    super.onDestroy(); 
    if(alertDialog != null && alertDialog.isShowing()) { 
     alertDialog.cancel(); 
    } 
} 

LogCat Ошибка.

Activity com.test.example.MovieList has leaked window 
com.android.internal.policy.impl.PhoneWindow$DecorView{1ed0b473 V.E..... R....... 
    0,0-1080,543} that was originally added here at android.view.ViewRootImpl.<init> 
     (ViewRootImpl.java:363) 

адаптер

public class MyAdapter extends RecyclerView.Adapter <MyAdapter.ViewHolder>{ 

     private List<Movies> moviesList; 
     private Context mContext; 
     AlertDialog alertDialog; 

    public MyAdapter (Context context, List<Movies> list) { 
      mContext = context; 
      moviesList= list; 
     } 

     @Override 
     public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      mContext = parent.getContext(); 
      View view = View.inflate(parent.getContext(), R.layout.movies, null); 
      return new ViewHolder(view); 
     } 

    @Override 
     public void onBindViewHolder(final ViewHolder holder, int viewType) { 
     final Movies movies = moviesList.get(holder.getAdapterPosition()); 
     final String id = movies.getId() 

     holder.title.setText(movies.getTitle()); 

     holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View v) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.AppCompatAlertDialogStyle); 
       builder.setTitle(R.string.dialog_title); 

       builder.setPositiveButton("Delete", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         moviesList.remove(holder.getAdapterPosition()); 
         DBHelper db = new DBHelper (mContext); 
         db.deleteMovie(movie); 
         notifyDataSetChanged(); 
         db.close(); 
         dialog.dismiss(); 
        } 
       }); 
       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
        } 
       }); 

       alertDialog = builder.create(); 
       alertDialog.show(); 
       return false; 
      } 
     }); 
    } 

     @Override 
     public int getItemCount() { 
      return (moviesList != null? moviesList.size():0); 
     } 

     class ViewHolder extends RecyclerView.ViewHolder { 

      TextView title; 

      ViewHolder(View itemView) { 
       super(itemView); 
       title = (TextView) itemView.findViewById(R.id.movie_title); 
      } 

     } 
    } 
+1

@Override общественного недействительными OnPause() { super.onPause(); if (alertDialog! = Null && alertDialog.isShowing()) { alertDialog.cancel(); } } Надеюсь, это поможет вам –

+0

Создайте экземпляр Dialog в действии и передайте его в Adapter. Затем вы можете использовать 'увольнение' в Activity. – TruongHieu

ответ

0

У меня есть один (может быть) возможное решение.

Заменить

AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.AppCompatAlertDialogStyle); 

С

AlertDialog.Builder builder = new AlertDialog.Builder(mContext.getApplicationContext(), R.style.AppCompatAlertDialogStyle); 

Примечание: Заменить контекст вашей деятельности с контекста приложения. Причина, по которой ваша активность может иметь ссылку в диалоговом окне предупреждения, которая вызывает эту утечку.

0

Вы можете настроить обратный вызов с помощью интерфейса, сообщите об активности.

Ваш адаптер

public class MyAdapter extends RecyclerView.Adapter <MyAdapter.ViewHolder>{ 

     private List<Movies> moviesList; 
     private Context mContext; 
     AlertDialog alertDialog; 
     private AdapterCallback callback; 



    public MyAdapter (Context context, List<Movies> list, AdapterCallback callback) { 
      mContext = context; 
      moviesList= list; 
      this.callback=callback; 
     } 

     @Override 
     public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      mContext = parent.getContext(); 
      View view = View.inflate(parent.getContext(), R.layout.movies, null); 
      return new ViewHolder(view); 
     } 

    @Override 
     public void onBindViewHolder(final ViewHolder holder, int viewType) { 
     final Movies movies = moviesList.get(holder.getAdapterPosition()); 
     final String id = movies.getId() 

     holder.title.setText(movies.getTitle()); 

     holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View v) { 

       if(this.callback!=null) 
        callback.onButtonLongPress(holder.getAdapterPosition()) 
       return false; 
      } 
     }); 
    } 

     @Override 
     public int getItemCount() { 
      return (moviesList != null? moviesList.size():0); 
     } 

     class ViewHolder extends RecyclerView.ViewHolder { 

      TextView title; 

      ViewHolder(View itemView) { 
       super(itemView); 
       title = (TextView) itemView.findViewById(R.id.movie_title); 
      } 

     } 

    public interface AdapterCallback{ 
    void onButtonLongPress(int position); 
} 
    } 


**Your Activity** 

    public MyActivity extends Activity implement MyAdapter.AdapterCallback{ 
    ... 

    void onButtonLongPress(final int position){ 

      AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.AppCompatAlertDialogStyle); 
       builder.setTitle(R.string.dialog_title); 

       builder.setPositiveButton("Delete", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         moviesList.remove(holder.getAdapterPosition()); 
         DBHelper db = new DBHelper (mContext); 
         db.deleteMovie(movie); 
         notifyDataSetChanged(); 
         db.close(); 
         dialog.dismiss(); 
        } 
       }); 
       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
        } 
       }); 

       alertDialog = builder.create(); 
       alertDialog.show(); 

      } 
}