2015-11-09 1 views
3

Этого фрагмент кода в классе CircleView простираться Просмотрамикак сделать андроид ручкой статической при использовании локальных нон статических переменного класса в handleMessage

private Handler handler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 

     super.handleMessage(msg); 
     if (curAng > 0 && curTime > 0) // this is non static varriable in class 
     { 
      curAng = curAng - (2 * Math.PI)/360; 
     } 
     else 
     { 
      curAng = 0; // this is non static variable in class 
      task.cancel(); // this is non static variable in class 
     } 
     invalidate(); 
    } 
}; 

Я пытался парой решения от StackOverflow, но ничего не работает для меня. Пример ниже

static class MyInnerHandler extends Handler{ 
     WeakReference<CircleView> mFrag; 

     MyInnerHandler(CircleView aview) { 
      mFrag = new WeakReference<CircleView>(aview); 
     } 

     @Override 
     public void handleMessage(Message msg) 
     { 

      super.handleMessage(msg); 
      if (curAng > 0 && curTime > 0) // this is non static variable in class 
      { 
       curAng = curAng - (2 * Math.PI)/360; 
      } 
      else 
      { 
       curAng = 0; // this is non static variable in class 
       task.cancel(); // this is non static variable in class 
      } 
      invalidate(); 
     } 
    } 
    MyInnerHandler myHandler = new MyInnerHandler(this); 

Проблемы, если я следовать этому коду выше я получаю ошибку, не статическое поле не могу ссылаться на статическую context.And я не хочу, чтобы изменить личные переменные статичен. Пожалуйста, помогите Спасибо. (Примечание: - Я также использую handler.obtainMessage().sendToTarget(); где-то в своем коде).

Наконец, я нашел решение о том, как получить доступ к переменным класса, не делая их статическими.

Вот ответ: -

static class MyInnerHandler extends Handler{ 
    WeakReference<CircleView> mFrag; 

    MyInnerHandler(CircleView aview) { 
     mFrag = new WeakReference<CircleView>(aview); 
    } 

    @Override 
    public void handleMessage(Message msg) 
    { 
     CircleView aview = mFrag.get(); // Here is solution. with aview. can access all method and variables. 
     super.handleMessage(msg); 
     if (aview.curAng > 0 && aview.curTime > 0) // this is non static varriable in class 
     { 
      aview.curAng = curAng - (2 * Math.PI)/360; 
     } 
     else 
     { 
      aview.curAng = 0; // this is non static variable in class 
      aview.task.cancel(); // this is non static variable in class 
     } 
     aview.invalidate(); 
    } 
} 
MyInnerHandler myHandler = new MyInnerHandler(this); 
+0

Почему создание 'MyInnerHandler' класса' static'? –

+0

Поскольку андроид-студия дает это предупреждение -> класс обработчика должен быть статичным или может возникнуть утечка –

ответ

0

Я думаю, что к тому же делать, как вы сделали, вы бы лучше также проверить AView не нулевой, прежде чем продолжить. Потому что, когда сообщение отправляется обработчику, исходное представление, возможно, ушло, и у вас есть шанс быть уже собранным мусором.

@Override 
public void handleMessage(Message msg) 
{ 

    super.handleMessage(msg); 

    CircleView aview = mFrag.get(); // Here is solution. 
        //with aview. can access all method and variables. 


    if (aview==null) return; 

    ... ... 
} 
+0

это не отвечает на его вопрос – Neil

+0

После того, как он ставит класс обработчика статичным, эти проверки становятся как-то важными. Внутри встроенного класса он всегда держит ссылку на объект держателя, не позволяя объекту держателя быть мусором (так что очень естественно, что к объектам-держателям можно получить доступ напрямую). Тем не менее, при внедрении в статическом классе он не мешает классу держателя быть мусором, что ограничивает риск утечки памяти. Тогда в то же время проверка ссылки должна быть частью решения. –