Этот ответ может быть запоздалым, но я хотел бы упомянуть несколько вещей, когда ваш Activity
зависит от AsyncTask
. Это поможет вам предотвратить сбои и управление памятью. Как уже упоминалось в приведенных выше ответах, переходите к interface
, мы также говорим, что они обратные вызовы. Они будут работать как информатор, но никогда не будут отправлять ссылки Activity
или interface
всегда использовать слабую ссылку в этих случаях.
Пожалуйста, обратитесь к скриншоту ниже, чтобы узнать, как это может вызвать проблемы.
Как вы можете видеть, начали ли мы AsyncTask
с сильной ссылки, тогда нет гарантии, что наш Activity
/ Fragment
будет до тех пор, пока мы не получим данные, поэтому было бы лучше использовать WeakReference
в этих случаях, и это также поможет в управлении памятью, поскольку мы никогда не будем придерживаться сильной ссылки на наш Activity
, тогда он будет иметь право на сбор мусора после его искажения.
Проверьте ниже фрагмент кода, чтобы узнать, как использовать awesome WeakReference -
MyTaskInformer.java
Интерфейс, который будет работать как информатор.
public interface MyTaskInformer {
void onTaskDone(String output);
}
MySmallAsyncTask.java
AsyncTask выполняет длительную задачу, которая будет использовать WeakReference
.
public class MySmallAsyncTask extends AsyncTask {
// ***** Hold weak reference *****
private WeakReference mCallBack;
public MySmallAsyncTask(MyTaskInformer callback) {
this.mCallBack = new WeakReference<>(callback);
}
@Override
protected String doInBackground(String... params) {
// Here do whatever your task is like reading/writing file
// or read data from your server or any other heavy task
// Let us suppose here you get response, just return it
final String output = "Any out, mine is just demo output";
// Return it from here to post execute
return output;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
// Here you can't guarantee that Activity/Fragment is alive who started this AsyncTask
// Make sure your caller is active
final MyTaskInformer callBack = mCallBack.get();
if(callBack != null) {
callBack.onTaskDone(s);
}
}
}
MainActivity.java
Этот класс используется для запуска моего AsyncTask
реализации interface
в этом классе и override
этот обязательный метод.
public class MainActivity extends Activity implements MyTaskInformer {
private TextView mMyTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMyTextView = (TextView) findViewById(R.id.tv_text_view);
// Start your AsyncTask and pass reference of MyTaskInformer in constructor
new MySmallAsyncTask(this).execute();
}
@Override
public void onTaskDone(String output) {
// Here you will receive output only if your Activity is alive.
// no need to add checks like if(!isFinishing())
mMyTextView.setText(output);
}
}
Вы не изменили бы существующие шаблоны. Другими словами, не делайте , изменяют что-либо под /Developer
иерархия (или везде, где Вы установили свои инструменты разработчика).
Вместо этого клон шаблоны Вы хотите настроить варианты. Тогда измените их имена и информацию в них. Наконец, поместите их в соответствующее местоположение в папке Вашей учетной записи Library/Application Support
, конкретно:
~/Library/Application Support/Developer/Shared/Xcode/File Templates/
~/Library/Application Support/Developer/Shared/Xcode/Target Templates/
~/Library/Application Support/Developer/Shared/Xcode/Project Templates/
Тот способ, которым они не будут перезаписаны при установке новых инструментов разработчика, и можно настроить их к содержанию основы.
XCode использует шаблонные файлы для файла и шаблонов проекта и делает переменное расширение в обоих во время создания.
шаблоны Xcode 3.0 могут быть найдены в [Установка Dev]/Library/Xcode/, вероятный/Developer/Library/Xcode. Если Вы хотите изменить эти шаблоны или добавить Ваше собственное, используйте следующие каталоги для сохранения новых/измененных шаблонов так, чтобы они не были вытерты будущими обновлениями Инструмента Разработчика:
я думаю, что можно также использовать/Library/Developer/Shared/Xcode / [File|Target|Project] Шаблоны / каталог для шаблонов, совместно использованных всеми пользователями.
, Если Вы просто хотите измениться MyCompanyName в шаблонах, следующая командная строка добьется цели:
defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions '{ "ORGANIZATIONNAME" = "NewCompanyName";}'
А хорошее учебное руководство при записи шаблонов файла здесь [MacResearch.org].