Использование переданного контекста в ArrayAdapter - PullRequest
2 голосов
/ 27 января 2012

В моем классе ArrayAdapter я фиксирую переданный контекст. Затем в методе getView у меня есть выражение if:

if(m.getSide() == RED) {
    v.setBackgroundColor(lc.getResources().getColor(R.color.red_bouy));
    Log.d("MA", "HERE");
} else if(m.getSide() == BLACK) {
    v.setBackgroundColor(lc.getResources().getColor(R.color.black_bouy));
}

(lc - это контекст, который я получаю из конструктора)

Если я просто использую Color.red, он работает найти.Все примеры, которые я видел, используют ghet getResources ..., но изнутри действия.
Есть предложения?

Ответы [ 3 ]

9 голосов
/ 27 января 2012

Ну, на самом деле передача экземпляра Context в адаптер и сохранение его ссылки не должны быть источником каких-либо проблем (таких как утечки памяти и т. Д.). Я так думаю, потому что если вы проверите источники, скажем, ArrayAdapter<T>, то увидите, что он также принимает Context в конструкторе и (что более важно) сохраняет сильную ссылку на него через закрытый член mContext и для этого есть геттер - getContext(). Он также не имеет никакого кода, который мог бы каким-либо образом отсоединить этот Context от ссылки, поэтому он живет там до тех пор, пока работает адаптер.

Однако с точки зрения производительности я бы определил цвета в вашем конструкторе адаптера, а затем просто использовал их непосредственно в getView() без необходимости многократного вызова getContext().getResources().getColor().

8 голосов
/ 27 января 2012

Когда вы создаете адаптер, вы передаете Context в конструктор.В getView () вы можете вызвать getContext (). GetResources (). Get ... Это то, что вы искали?

Также,@MahdeTo прав: кажется, вы сохраняете прямую ссылку на контекст - не надо!Вы утечете свой контекст.Если вам абсолютно необходимо, используйте WeakReference и проверьте на null , но я не понимаю, зачем вам это нужно.

UPD: На самом деле не проблема с Adapter s (tnx to @Arhimed и @Rperryng для указания на это), поскольку их правильное использование гарантирует, что их жизненный цикл не превышает жизненный цикл их Context, так что это нормальносохраните действующую ссылку на Context [, даже если сам адаптер имеет действующую ссылку в Context - GC довольно умен, не одурачен круговыми ссылками] .Тем не менее, в этом случае нет необходимости делать это: ArrayAdapter.getContext() существует именно для этой цели - так что вы можете получить доступ к ресурсам и получить Inflater, когда вам нужно создать представления в getView()

2 голосов
/ 27 января 2012

Для этого типа загрузки ресурса используйте Context.getApplicationContext () статический метод, чтобы получить контекст, который не принадлежит представлению. Таким образом вы избежите потенциальных утечек памяти.

...