Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Android > Android? новый объект с (context)


Автор: MaksSh 14.7.2011, 12:23
Добрый день!
На java начал программировать недавно и у меня возник вопрос: как создать в функции класса новый объект содержащий context?
Тоесть имеем класс:

Код


public class Panel extends SurfaceView implements SurfaceHolder.Callback{
    public Panel(Context context) {
        super(context);
 mElement =new Element(context);
    }
}
public void doDraw(long elapsed, Canvas canvas) {
        // TODO Auto-generated method stub
        canvas.drawColor(Color.BLUE);
        drawScreen(canvas);
        mElement.update(elapsed, canvas);  
       if(bTimer == true){
         mElement.animation();
         if(mElement.bFin){
                ScreenFiled();
               createElement();
         }
         bTimer = false;
        };
private void createElement(){
        Context mContext;
        mContext = this.getContext();
        mElement = new Element(mContext); ???????
    }
}

вопрос, как создать новый объект в функции createElement().

при отладке заглядывал в переменную context, в конструкторе и в функции она одинаковая
функцию createElement() вызываю в из функции onDraw() может проблема в этом так как в других функциях функция  createElement()  работает нормально.

Автор: AntonSaburov 14.7.2011, 13:41
Так что за проблема ? Вернуть объект из createElement ?
А такое не подойдет ?

Код

private Element createElement(){
        Context mContext;
        mContext = this.getContext();
        mElement = new Element(mContext); ???????
        return mElement;
}

Автор: MaksSh 14.7.2011, 14:28
проблема в том что приложение валится на сроке 
Код

mElement = new Element(mContext); ???????

и соответственно указывает на строку в конструкторе класса Element
Код

public class Element extends SurfaceView{
    public Element(Context context) {
        super(context); ????????????????????

тоесть какие то проблемы с переменной context. В чём проблема я непойму.

Пытался в этой функции создать Teast 
Код

Context mContext;
        mContext = this.getContext();
        int duration = Toast.LENGTH_SHORT;

        toast = Toast.makeText(mContext, text, duration);

та же история.

Автор: AntonSaburov 14.7.2011, 15:19
А с каким сообщением валиться ? Мы же не экстрасенсы, чтобы догадываться. Ты о том, что валиться даже не написал.
Давай подробности - а то так можно долго воду в ступе толочь.

Автор: MaksSh 14.7.2011, 18:13
в конструкторе класса Panel создаём объект класса Element 
Код

public class Panel extends SurfaceView implements SurfaceHolder.Callback{
public Panel(Context context) {
        super(context);

            mElement =new Element(context);
   }
}

в функции onDrawего обновляем, всё как положено
Код

public void doDraw(long elapsed, Canvas canvas) {
        // TODO Auto-generated method stub
        canvas.drawColor(Color.BLUE);
        drawScreen(canvas);
        mElement.update(elapsed, canvas);  

потом я создаю новый объект класса Element 
Код

private void createElement(){
        Context mContext;
        mContext = this.getContext();
        mElement = new Element(mContext);
    }

вот тут то и начинается свистопляска, отладчик показывает что проблемы в строке mElement = new Element(mContext);
и если капнуть глубже в строке super(context);
Код

public Element(Context context) {
        super(context);


в отладчике заглянул в переменную context вроде всё нормально.
могу выложить весь код класса Panel.

Автор: spyswamp 15.7.2011, 10:35
Во-первых, зачем ты создаешь еще один такой же элемент?
Во-вторых, почитай про обработку исключений - 99% вопросов отпадет сразу.

Автор: MaksSh 15.7.2011, 11:26
spyswamp, 
Где почитать, кинь , пожалуйста, ссылку.
Спасибо, не надо нашел.

Автор: ivanovpv 18.7.2011, 07:37
Цитата

тоесть какие то проблемы с переменной context. В чём проблема я непойму.


Эээ ребята вы чего? Переменные типа Context/Activity не стоит держать в членах класса - ну или по крайней мере это надо делать очень осторожно! Это чревато утечками памяти. http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

Если вкратце, то памятка такая:

Код

In summary, to avoid context-related memory leaks, remember the following:

•Do not keep long-lived references to a context-activity (a reference to an activity should have the same life cycle as the activity itself)
•Try using the context-application instead of a context-activity
•Avoid non-static inner classes in an activity if you don't control their life cycle, use a static inner class and make a weak reference to the activity inside. The solution to this issue is to use a static inner class with a WeakReference to the outer class, as done in ViewRoot and its W inner class for instance
•A garbage collector is not an insurance against memory leaks

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)