У меня недавно была та же проблема для Android 9, но мне пришлось использовать несколько URL для разных экранов. Поэтому я добавил android: usedCleartextTraffic = "true" в Manifest, и это сработало, но мы не хотели ставить под угрозу безопасность всего приложения. Таким образом, исправление было в изменении ссылок с HTTP на https. Но если вам приходилось использовать только http для связи с вашим приложением, то вот ваше решение.
Use in Manifest application tag
android:networkSecurityConfig="@xml/security_config"
И создайте XML-файл, подобный этому.
<network-security-config>
<base-config cleartextTrafficPermitted="true"/>
<debug-overrides>
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</debug-overrides>
Полу -колон после закрывающей скобки в объявлении типа требуется языком. Так было с самых ранних версий C.
И да, люди действительно делают заявление, которое вы только что там изложили. Это полезно для создания типов областей действия внутри методов.
void Example() {
struct { int x; } s1;
s1.x = 42;
struct ADifferentType { int x; };
}
В этом случае, я думаю, понятно, зачем нужны точки с запятой. Что касается необходимости в более общем случае объявления в заголовочном файле, я не уверен. Мое предположение состоит в том, что он исторический и был сделан, чтобы упростить написание компилятора.
Я полагаю, это потому, что классы являются объявлениями, даже когда им нужны скобки для группировки. И да, есть исторический аргумент, что, поскольку в C вы могли бы сделать
struct
{
float x;
float y;
} point;
, вы должны в C ++ быть в состоянии сделать то же самое, имеет смысл для объявления class
вести себя таким же образом.
Это сокращение от
class MyClass
{
.
.
.
};
// instance declaration
MyClass MyInstance; // semicolon here
. Точка с запятой после фигурных скобок объявления класса на самом деле излишня, но именно так определяется C ++. Точка с запятой после объявления переменной всегда нужна и имеет смысл.
Я не использую такие объявления
class MyClass
{
.
.
.
} MyInstance;
Но в этом случае я могу понять, почему точка с запятой есть.
Потому что это похоже на int a;
- объявление переменной.
Вероятно, для согласованности, поскольку вы можете пропустить точку с запятой «MyInstance», она остается там.
Это необходимо после struct
по соображениям совместимости, и как бы вы хотели это:
struct MyStruct { ... };
class MyClass { ... } //inconsistency
In C/C++ the ; is a statement terminator. All statements are terminated with ; to avoid ambiguity (and to simplify parsing). The grammar is consistent in this respect. Even though a class declaration (or any block for that matter) is multiple lines long and is delimited with {} it is still simply a statement (the { } is part of the statement) hence needs to be terminated with ; (The ; is not a separator/delimitor)
In your example
class MyClass{...} MyInstance;
is the complete statement. One could define multiple instances of the declared class in a single statement
class MyClass{...} MyInstance1, MyInstance2;
This is completely consistent with declaring multiple instances of a primitive type in a single statement:
int a, b, c;
The reason one does not often see such desclaration of class and instance, is the instance could ?only? be a global variable, and you don't really often want global objects unless they are static and/or Plain Old Data structures.