Здесь компиляция наиболее распространенных способов достижения этого :
WeakReferences
TL; DR: существует два способа совместного использования данных: передача данные в дополнительных целях или сохранить их где-то в другом месте. Если данные являются примитивами, строками или определенными пользователем объектами: отправьте его как часть дополнительных намерений (пользовательские объекты должны реализовать Parcelable
). Если передающие сложные объекты сохраняют экземпляр в одноэлементном месте где-то еще и получают доступ к ним из запущенного действия.
Некоторые примеры того, как и почему реализовать каждый подход:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("some_key", value);
intent.putExtra("some_other_key", "a value");
startActivity(intent);
Во втором действии:
Bundle bundle = getIntent().getExtras();
int value = bundle.getInt("some_key");
String value2 = bundle.getString("some_other_key");
Используйте этот метод, если вы передаете примитивные данные или строки. Вы также можете передавать объекты, которые реализуют Serializable
.
Хотя вы соблазнительны, вы должны подумать дважды, прежде чем использовать Serializable
: он подвержен ошибкам и ужасно медленный. Так что вообще: держитесь подальше от Serializable
, если это возможно. Если вы хотите передать сложные пользовательские объекты, взгляните на интерфейс Parcelable
.
. Можно обмениваться данными между действиями, сохраняя их в памяти учитывая, что в большинстве случаев оба действия выполняются в одном и том же процессе.
Примечание: иногда, когда пользователь покидает вашу деятельность (не покидая ее), Android может решить убить ваше приложение. В таком сценарии у меня были случаи, когда андроид пытается запустить последнее действие, используя намерение, представленное до того, как приложение было убито. В этом случае данные, хранящиеся в одноэлементном (либо вашем, либо Application
), исчезнут, и могут произойти плохие вещи. Чтобы избежать таких случаев, вы либо сохраняете объекты на диске, либо проверяете данные, прежде чем использовать их, чтобы убедиться, что они действительны.
Имейте класс для хранения данных:
public class DataHolder {
private String data;
public String getData() {return data;}
public void setData(String data) {this.data = data;}
private static final DataHolder holder = new DataHolder();
public static DataHolder getInstance() {return holder;}
}
Из запущенной деятельности:
String data = DataHolder.getInstance().getData();
Синтаксис приложения - это экземпляр android.app.Application
, который создается, когда приложение запускается. Вы можете предоставить пользовательский вариант, расширив Application
:
import android.app.Application;
public class MyApplication extends Application {
private String data;
public String getData() {return data;}
public void setData(String data) {this.data = data;}
}
Перед запуском деятельности:
MyApplication app = (MyApplication) getApplicationContext();
app.setData(someData);
Затем из запущенной активности:
MyApplication app = (MyApplication) getApplicationContext();
String data = app.getData();
Идея в основном такая же, как синглтон, но в этом случае вы предоставляете статический доступ к данным:
public class DataHolder {
private static String data;
public static String getData() {return data;}
public static String setData(String data) {DataHolder.data = data;}
}
Из запущенной деятельности:
String data = DataHolder.getData();
WeakReferences
То же самое, но позволяет сборщику мусора удалять объекты без ссылок (например, когда пользователь завершает работу):
public class DataHolder {
Map> data = new HashMap>();
void save(String id, Object object) {
data.put(id, new WeakReference
Перед запуском деятельности:
DataHolder.getInstance().save(someId, someObject);
Из запущенной деятельности:
DataHolder.getInstance().retrieve(someId);
Возможно, вам может понадобиться передать идентификатор объекта с помощью дополнительных настроек намерения. Все зависит от вашей конкретной проблемы.
Идея состоит в том, чтобы сохранить данные на диске перед запуском другого действия.
Преимущества: вы можете запустить активность из других мест, и если данные уже сохранены, это должно работать нормально.
Недостатки: это громоздко и требует больше времени для реализации. Требуется больше кода и, следовательно, больше шансов ввести ошибки.
Некоторые способы сохранения объектов включают в себя:
Ответ. Для этого вы можете использовать функцию буферизации / управления PHP Output / control . Вот некоторая простая функция, которая получает вывод скрипта и возвращает его:
Код:
Используемые вещи: ob_start()
ob_get_clean()
is_readable()
function getScriptOutput($path, $print = FALSE)
{
ob_start();
if( is_readable($path) && $path )
{
include $path;
}
else
{
return FALSE;
}
if( $print == FALSE )
return ob_get_clean();
else
echo ob_get_clean();
}
Использование:
$path = '../photos_page.php';
$html = getScriptOutput($path);
if( $html === FALSE)
{
# Action when fails
}
else
{
echo $html;
}
Для этого вы должны использовать file_get_contents("http://yourdomain.com/path/to/photos_page.php")
.
НО: Если бы я был вами, я бы сделал это следующим образом:
photos_page.php
<?php
function get_photos_html() {
$html = // generate html
return $html;
}
?>
main_file.php
<?php
include('../photos_page.php');
$html = get_photos_html();
?>
file_get_contents("../photos_page.php")
не будет работать. В этом случае вы будете извлекать файл локально. Нужно что-то вроде file_get_contents("http://www.domain.com/photos_page.php")
– Dutchie432
3 May 2011 в 20:21
Это должно сделать трюк:
ob_start();
require('../photos_page.php');
$html = ob_get_contents();
ob_end_clean();
Если ваш photos_page.php
работает следующим образом:
<?php
// very basic code
$img = "/path/to/my/image.jpg";
echo '<img src="' . $img . '">' . PHP_EOL;
?>
Тогда вы могли бы использовать:
$html = file_get_contents('http://mysite.com/photos_page.php');
Но на самом деле вам следует переписать код, чтобы вы не Это нужно сделать так.
Вы хотите попробовать file_get_contents
$html = file_get_contents("http://www.yourwebsite.com/pages/photos_page.php");
//this will not work since it won't run through web server
//$html = file_get_contents("../photos_page.php");
Я предполагаю, что вы опубликовали псевдокод.
Код, который вы написали ранее и который не сработал, не должен использоваться снова. Я бы переписал нужные вам части и создал некоторые функции или даже класс, который вы можете использовать, чтобы получить все, что вам нужно.
Буферизация вывода будет содержать выводимый текст в памяти вместо фактического вывода его в ответ.
Сначала создайте буфер, вызвав функцию ob_start()
. Когда вы закончите сохранение вывода в буфере, вызовите ob_get_clean()
, чтобы вернуть содержимое буфера и очистить буфер.
ob_start();
include "../photos_page.php";
$html = ob_get_clean();
Вы можете использовать буферизацию вывода . Это поместит весь вывод, который обычно отправляется клиенту, в буфер, который вы затем можете извлечь:
ob_start();
include '../photos_page.php';
$html = ob_get_contents();
ob_end_clean();
. Если вы хотите, вы можете поместить эту функцию в функцию, чтобы она работала как вы описали:
function parse_my_script($path)
{
ob_start();
include $path;
$html = ob_get_contents();
ob_end_clean();
return $html;
}
Это, конечно, предполагает, что ваш включенный файл не требует использования глобальных переменных.
Для получения дополнительной информации проверьте все выходные данные функции управления: