使用单例模式造成的内存泄漏

Posted 安卓笔记侠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用单例模式造成的内存泄漏相关的知识,希望对你有一定的参考价值。

“管道”是java.io包的一部分。它是Java的特性,而不是android特有的。一条“管道”为两个线程建立一个单向的通道。生产者负责写数据,消费者负责读取数据。

下面是一个使用管道流进行通信的例子。

 1 public class PipeExampleActivity extends Activity {
 2  
 3     private static final String TAG = "PipeExampleActivity";
 4     private EditText editText;
 5  
 6     PipedReader r;
 7     PipedWriter w;
 8  
 9     private Thread workerThread;
10  
11     public void onCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13  
14         r = new PipedReader();
15         w = new PipedWriter();
16  
17         try {
18             w.connect(r);
19         } catch (IOException e) {
20             e.printStackTrace();
21         }
22  
23         setContentView(R.layout.activity_pipe);
24         editText = (EditText) findViewById(R.id.edit_text);
25         editText.addTextChangedListener(new TextWatcher() {
26             @Override
27             public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
28             }
29  
30             @Override
31             public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
32                 try {
33                     if(count > before) {
34                         w.write(charSequence.subSequence(before, count).toString());
35                     }
36                 } catch (IOException e) {
37                     e.printStackTrace();
38                 }
39             }
40  
41             @Override
42             public void afterTextChanged(Editable editable) {
43             }
44         });
45  
46         workerThread = new Thread(new TextHandlerTask(r));
47         workerThread.start();
48     }
49  
50     @Override
51     protected void onDestroy() {
52         super.onDestroy();
53         workerThread.interrupt();
54         try {
55             r.close();
56             w.close();
57         } catch (IOException e) {
58         }
59     }
60  
61     private static class TextHandlerTask implements Runnable {
62         private final PipedReader reader;
63  
64         public TextHandlerTask(PipedReader reader){
65             this.reader = reader;
66         }
67         @Override
68         public void run() {
69             while(!Thread.currentThread().isInterrupted()){
70                 try {
71                     int i;
72                     while((i = reader.read()) != -1){
73                         char c = (char) i;
74                         
75                         Log.d(TAG, "char = " + c);
76                     }
77  
78                 } catch (IOException e) {
79                     e.printStackTrace();
80                 }
81             }
82         }
83     }
84 }

在这个例子中,对EditText设置一个TextWatcher监听,一旦EditText的内容发生改变,就向“管道”中输入字符,它就是所谓的生产者。同时,有一个工作线程负责从管道中读取字符,它就是所谓的消费者。这样,就实现了UI线程和工作线程之间的数据通信。

以上是关于使用单例模式造成的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

内存泄漏篇--1

内存泄漏篇--1.基础问题

安卓面试中高级面试

Android性能优化之利用LeakCanary检测内存泄漏及解决办法(转)

Android性能优化之利用LeakCanary检测内存泄漏及解决办法(转)

LeakCanary检测内存泄漏