android的界面销毁,网络还在请求问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fox_wei_hlz/article/details/64443055

 今天写一点关于安卓的界面保护技巧:

1.其实很多时候安卓的界面的实现不难,那么主要是一些保护要怎么做的问题。今天就来谈谈。

先贴一段代码上去 

class MessageHandler extends Handler {
WeakReference<Activity> weak;
public MessageHandler(Activity activity){
        weak = new WeakReference<Activity >(activity);
    }

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (weak.get() == null){
return;
}
switch (msg.what){
case 0:
finish();
break;

}
}
}
这一段代码其实很多讲述的是关于界面的实现,很多时候网络加载下来的界面数据操作要在异步线程进行,那么这个时候。很尴尬的会发生在新手身上。就是有时候会莫名的崩溃。其实这是关于界面回收~异步线程还在进行数据赋值,莫名的空指针。
咦~这个时候如果加入这一段话WeakReference 这一段有一个好处就是会先储存这个界面然后进行一个判断是否这个界面进行了回收。那为什么这个就可以呢~API里面的讲解是这样的:构造一个新的弱引用给定的指示物。新创建的引用是没有注册任何引用队列。队列注册的引用对象。空值的结果在一个弱引用,不与任何队列。是不是很有趣~这就是API里面的讲解。那
SoftReference行不行呢?系统可能会推迟清算和入队软引用,然而所有{ @codeSoftReference }年代指着软可及的对象将被清除运行时抛出一个{ @link OutOfMemoryError },其他和上面的一样,但是这一点推迟是没办法进行判断,所以
我现在一般使用的WeakReference这个使用方式,去避免更多的无厘头崩溃。然后我们仅仅只是使用在这个地方吗?其实还有很多地方可以使用到这个方法。再比如线程延迟加载:
mMessageHandler.sendEmptyMessageAtTime(1,1000)这种的方式的代码,建议使用分装class进行操作。一方面呢~可以进行统一处理方便修改。这个方法如果仅仅只是使用到了上面的方式还是不够的。还是会引起崩溃的。可能性会低一点。那么分析一些为什么会崩溃呢?其实就是在界面刚好关闭
这个时候线程刚好启动。。。那么该怎么进行统一处理呢?那么这边给出一个方式就是如下代码:
class MessageHandler extends Handler {
WeakReference<Activity> weak;
public MessageHandler(Activity activity){
        weak = new WeakReference<Activity >(activity);
    }
public void removeDelayMessage() {
this.removeMessages(0);
}//这个方法进行统一移除延迟加载的线程
    @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (weak.get() == null){
return;
}
switch (msg.what){
case 0:
finish();
break;

}
}
}
这个有一个好处就是你可能延迟加载了多个线程,但是这个可以进行一个统一式的移除。只要在onpause这个位子或者你需要的ondestory这些位子,进行调用这个方法就可以了~是感觉很嗨啊~~啊哈哈

1.其实很多时候安卓的界面的实现不难,那么主要是一些保护要怎么做的问题。今天就来谈谈。

先贴一段代码上去 

class MessageHandler extends Handler {
WeakReference<Activity> weak;
public MessageHandler(Activity activity){
        weak = new WeakReference<Activity >(activity);
    }

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (weak.get() == null){
return;
}
switch (msg.what){
case 0:
finish();
break;

}
}
}
这一段代码其实很多讲述的是关于界面的实现,很多时候网络加载下来的界面数据操作要在异步线程进行,那么这个时候。很尴尬的会发生在新手身上。就是有时候会莫名的崩溃。其实这是关于界面回收~异步线程还在进行数据赋值,莫名的空指针。
咦~这个时候如果加入这一段话WeakReference 这一段有一个好处就是会先储存这个界面然后进行一个判断是否这个界面进行了回收。那为什么这个就可以呢~API里面的讲解是这样的:构造一个新的弱引用给定的指示物。新创建的引用是没有注册任何引用队列。队列注册的引用对象。空值的结果在一个弱引用,不与任何队列。是不是很有趣~这就是API里面的讲解。那
SoftReference行不行呢?系统可能会推迟清算和入队软引用,然而所有{ @codeSoftReference }年代指着软可及的对象将被清除运行时抛出一个{ @link OutOfMemoryError },其他和上面的一样,但是这一点推迟是没办法进行判断,所以
我现在一般使用的WeakReference这个使用方式,去避免更多的无厘头崩溃。然后我们仅仅只是使用在这个地方吗?其实还有很多地方可以使用到这个方法。再比如线程延迟加载:
mMessageHandler.sendEmptyMessageAtTime(1,1000)这种的方式的代码,建议使用分装class进行操作。一方面呢~可以进行统一处理方便修改。这个方法如果仅仅只是使用到了上面的方式还是不够的。还是会引起崩溃的。可能性会低一点。那么分析一些为什么会崩溃呢?其实就是在界面刚好关闭
这个时候线程刚好启动。。。那么该怎么进行统一处理呢?那么这边给出一个方式就是如下代码:
class MessageHandler extends Handler {
WeakReference<Activity> weak;
public MessageHandler(Activity activity){
        weak = new WeakReference<Activity >(activity);
    }
public void removeDelayMessage() {
this.removeMessages(0);
}//这个方法进行统一移除延迟加载的线程
    @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (weak.get() == null){
return;
}
switch (msg.what){
case 0:
finish();
break;

}
}
}
这个有一个好处就是你可能延迟加载了多个线程,但是这个可以进行一个统一式的移除。只要在onpause这个位子或者你需要的ondestory这些位子,进行调用这个方法就可以了~是感觉很嗨啊~~啊哈哈
展开阅读全文

没有更多推荐了,返回首页