Android Активность утечки RecyclerView TTs - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь использовать движок TextToSpeech в RecyclerView, все работает нормально, но единственная проблема в том, что если я покидаю текущую активность, у меня есть утечка активности. Итак, я знаю, что мне нужно вызвать метод выключения для механизма TextToSpeech, но вопрос в том, где и как я это делаю? Спасибо

public class RecylerViewAdapter extends 
RecyclerView.Adapter<RecylerViewAdapter.RecylerViewV_VH> {
Context context;
String[] strings = {"one", "two", "tree"};

public RecylerViewAdapter(Context context) {
    this.context = context;
}


public RecylerViewV_VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view, parent, false);
    return new RecylerViewV_VH(view);
}

@Override
public void onBindViewHolder(@NonNull final RecylerViewV_VH holder, final int position) {
    holder.button.setText(strings[position]);

    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.tts.speak(strings[position], TextToSpeech.QUEUE_FLUSH, null);
        }
    });
}

@Override

public int getItemCount() {
    return strings.length;
}

public class RecylerViewV_VH extends RecyclerView.ViewHolder {
    Button button;
    TextToSpeech tts;

    public RecylerViewV_VH(@NonNull View itemView) {

        super(itemView);
        button = itemView.findViewById(R.id.button);
        tts = new TextToSpeech(context, new TextToSpeech.OnInitListener() {


            public void onInit(int status) {
                // TODO Auto-generated method stub
                if (status == TextToSpeech.SUCCESS) {
                    int result = tts.setLanguage(Locale.US);
                    if (result == TextToSpeech.LANG_MISSING_DATA ||
                            result == TextToSpeech.LANG_NOT_SUPPORTED) {
                        Log.e("error", "This Language is not supported");
                    } else {

                    }
                } else
                    Log.e("error", "Initilization Failed!");
            }
        });
    }
}

}

1 Ответ

0 голосов
/ 19 апреля 2020

Это работает, чем вы очень много.

Я выложу код только на тот случай, если у кого-то еще возникнет такая же проблема

 public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
RecylerViewAdapter recylerViewAdapter;
TextToSpeech tts;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    recyclerView = findViewById(R.id.recyclreView);
    tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
        public void onInit(int status) {
            // TODO Auto-generated method stub
            if (status == TextToSpeech.SUCCESS) {
                int result = tts.setLanguage(Locale.US);
                if (result == TextToSpeech.LANG_MISSING_DATA ||
                        result == TextToSpeech.LANG_NOT_SUPPORTED) {
                    Log.e("error", "This Language is not supported");
                } else {

                }
            } else
                Log.e("error", "Initilization Failed!");
        }
    });
    recylerViewAdapter = new RecylerViewAdapter(this, tts);
    recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
    recyclerView.setAdapter(recylerViewAdapter);
}

protected void onDestroy() {
    super.onDestroy();
    tts.stop();
    tts.shutdown();
}}

public class RecylerViewAdapter extends RecyclerView.Adapter<RecylerViewAdapter.RecylerViewV_VH> {
Context context;
String[] strings = {"one", "two", "tree"};
TextToSpeech textToSpeech;
public RecylerViewAdapter(Context context, TextToSpeech textToSpeech) {
    this.context = context;
    this.textToSpeech=textToSpeech;
}
public RecylerViewV_VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view, parent, false);
    return new RecylerViewV_VH(view);
}
public void onBindViewHolder(@NonNull final RecylerViewV_VH holder, final int position) {
    holder.button.setText(strings[position]);

    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            textToSpeech.speak(strings[position], TextToSpeech.QUEUE_FLUSH, null);
        }
    });
}
public int getItemCount() {
    return strings.length;
}

public class RecylerViewV_VH extends RecyclerView.ViewHolder {
    Button button;


    public RecylerViewV_VH(@NonNull View itemView) {

        super(itemView);
        button = itemView.findViewById(R.id.button);
    }
}
...