Как исправить ошибку OutOfMemory/Зависание моего Android-приложения?
Когда перехожу на эту активность, приложение зависает намертво, и после отвисания, иногда выдаёт OutOfMemory. Я не думаю, чтобы этот код мог занимать много памяти. Что мне делать?
package mate.files;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.Toast;
import androidx.appcompat.widget.Toolbar;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.Expose;
import java.io.IOException;;
import java.util.List;
public class MainPageBasicLayout extends AppCompatActivity {
int Layout1BottomLvl1Num = 0;
String[] Layout1BottomLvl1Features = new String[9];
String[] Layout1BottomLvl1Items = new String[9];
//JSON Fields
@Expose
String Layout1Bottom = null;
@Expose
List<String> Layout1BottomContent;
@Expose
List<String> Layout1BottomAppearance;
@Expose
String ExitBehavior = " ";
int Layout1BottomNum = 0;
MainPageBasicLayout obj = new MainPageBasicLayout();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_page);
//Get JSON file content
String JSON = null;
try {
JSON = new CfgMgr().GetJsonFileContent(this);
} catch (IOException e) {
e.printStackTrace();
}
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.excludeFieldsWithoutExposeAnnotation().create();
MainPageBasicLayout obj = gson.fromJson(JSON, MainPageBasicLayout.class);
//Prepare GSON objects to GC
gson = null;
builder = null;
JSON = null;
obj = null;
System.gc();
assert obj != null;
Toast.makeText(this, obj.ExitBehavior, Toast.LENGTH_LONG).show();
//Initialize
RelativeLayout Layout = findViewById(R.id.RelativeLayout);
Toolbar Layout1BottomUI = findViewById(R.id.Layout1Bottom);
//Set the Layout Parameters (Height & Width)
Toolbar.LayoutParams params = new Toolbar.LayoutParams(Integer.parseInt(obj.Layout1BottomAppearance.get(0)), ViewGroup.LayoutParams.MATCH_PARENT);
Layout1BottomUI.setLayoutParams(params);
//These settings will be applied when this Layout in Normal Bar Mode
if ("NormBarPinned".equals(obj.Layout1Bottom) || "NormBarUnpinned".equals(obj.Layout1Bottom)) {
//Get number of items & each item data (level 1)
Layout1BottomNum = obj.Layout1BottomContent.size();
int Counter2 = 0;
for (int Counter = 0; Counter != Layout1BottomNum; Counter++) {
if (!obj.Layout1BottomContent.get(Counter).contains("*")) {
Layout1BottomLvl1Num++;
Layout1BottomLvl1Items[Counter] = obj.Layout1BottomContent.get(Counter2);
Counter2++;
}
}
//Extract Item's Feature (level 1)
for (int CounterFeature = 0; CounterFeature != Layout1BottomLvl1Num; CounterFeature++) {
int FeatureEndIndex = Layout1BottomLvl1Items[CounterFeature].indexOf('\'') - 1;
Layout1BottomLvl1Features[CounterFeature] = Layout1BottomLvl1Items[CounterFeature].substring(0, FeatureEndIndex);
}
}
}
//Exit by pressing BACK
public void onDestroy() {
super.onDestroy();
if (obj.ExitBehavior.equals("NoReq")) {
System.exit(0);
} else {
Intent i = new Intent(this, MainPageBasicLayout.class);
startActivity(i);
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
dialogBuilder.setTitle(R.string.Confirmation);
dialogBuilder.setMessage(R.string.ReallyExit);
dialogBuilder.setCancelable(true);
// Exit Button
dialogBuilder.setPositiveButton(R.string.Exit, (dialog, which) -> {
dialog.dismiss();
System.exit(0);
});
}
}
}
Ошибка:
java.lang.OutOfMemoryError: Failed to allocate a 112 byte allocation with 0 free bytes and 0B until OOM, max allowed footprint 536870912, growth limit 536870912
at java.util.Arrays.copyOf(Arrays.java:3260)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:125)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:451)
at java.lang.StringBuilder.append(StringBuilder.java:137)
at java.lang.Daemons$FinalizerWatchdogDaemon.finalizerTimedOut(Daemons.java:398)
at java.lang.Daemons$FinalizerWatchdogDaemon.runInternal(Daemons.java:283)
at java.lang.Daemons$Daemon.run(Daemons.java:103)
at java.lang.Thread.run(Thread.java:784)