Как избежать утечки памяти в Asyntask? - PullRequest
0 голосов
/ 31 августа 2018

Ниже мой тестовый код. Я позволил нити спать нарочно. Я пытался моделировать тяжелую задачу ввода-вывода. Я пытался использовать статический внутренний класс. А также использовал WeakReference. Я думаю, что я должен пропустить очень важную часть. Я проверяю, что код все еще течет после завершения действия. Кто-нибудь может дать несколько советов? Благодарю.

public class Main2Activity extends AppCompatActivity {
TextView textView;

MyAsyn myAsyn;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    textView=findViewById(R.id.test_view);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           finish();
        }
    });

    myAsyn=new MyAsyn(textView);
    myAsyn.execute();

}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (myAsyn!=null){
        myAsyn.cancel(true);
    }
}
static class MyAsyn extends AsyncTask {

    WeakReference<TextView> textViewWeakReference;


    public MyAsyn(TextView textView) {
        this.textViewWeakReference = new WeakReference<>(textView);
    }

    @Override
    protected Object doInBackground(Object[] objects) {
        t(textViewWeakReference);

        try {
            Thread.sleep(10000000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }


    @Override
    protected void onPostExecute(Object o) {
        super.onPostExecute(o);
       TextView textView= textViewWeakReference.get();
       if (textView!=null) {
           textView.setText("DONE");
       }
    }
}



public  static  void t( WeakReference<TextView> textViewWeakReference){

    final TextView textView=textViewWeakReference.get();

    new Thread(){
        @Override
        public void run() {
            super.run();
            try {
                Thread.sleep(500000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            if (textView!=null) {
                String a = textView.getText().toString();

                String b = a + a;
            }

        }
    }.run();
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...