2016-03-03 7 views
0

Что касается задачи Async в android, то лучше всего включать их в качестве внутреннего класса активности, в которой вы работаете, или лучше иметь в качестве собственного самостоятельного класса? напримерAsync Task Best Practice

public MyClass extents Activity 
{ 
     public void onCreate(){ 
     } 

     public class MyAsyncTask extents AsyncTask<Void, Void, Void> 
     { 
       protected void doInBackground() 
       { 
        //do stuff here.... 
       } 
     } 
     public void onResume(){ 
     } 
} 

или в качестве внешнего класса

public class MyAsyncTask extents AsyncTask<Void, Void, Void> 
{ 
     protected void doInBackground() 
     { 
      //do stuff here.... 
     } 
} 


public MyClass extents Activity 
{ 
     public void onCreate(){ 
     } 
} 
+0

Зависит от того, что вы делаете - на самом деле нет «лучшего способа». Если он большой/длинный, я бы поместил его в свой собственный файл, как и для любого другого класса, чтобы ваш код не был грязным. Но в действительности это не имеет значения. Также стоит отметить, что Stack Overflow на самом деле не является подходящим местом для «мнений» - вы можете получить лучший ответ в другом месте. – JonasCz

+1

@JonasCz Ну, это важно на самом деле ... Было бы неважно, будет ли внутренний класс статическим. В другом случае он содержит ссылку на внешний класс, и это неправильно, если это активность как Asynctask может жить дольше. – Selvin

+0

@Selvin - Это не делает его «неправильным» ... это просто означает, что вам нужно иметь дело с этими ссылками и убедиться, что все это правильно обрабатывается во время изменений жизненного цикла, что все возможно. И это проблема, которая может возникнуть даже тогда, когда AsyncTask находится в отдельном файле класса. – NoChinDeluxe

ответ

5

AsyncTask имеет свой жизненный цикл, который не зависит от Activity жизненного цикла. Вы должны убедиться, что у него нет ссылки на активность или представления, когда активность уже уничтожена.

Реализация AsyncTask как внутренний класс имеет смысл, только если это static. Если он не является статическим, он будет иметь неявную ссылку на внешнюю активность, которая приведет к утечке памяти. Если вам нужны ссылки на представления из вашей статической асинхронной задачи, используйте WeakReference.

Реализация AsyncTask в отдельном файле также является хорошей идеей, но применяются те же правила. При необходимости используйте слабые ссылки.

Единственная разница между внутренней задачей async static и задачей async в отдельном файле - читаемость кода. Если в асинхронной задаче много логики, перейдите к отдельному файлу.