Das anhalten aller threads haben: ms Warnung die Verwendung von Threads - Android
Ich habe 2 Thread
s, dass einige Netzwerk Berechnung.
Wenn ich meine app und nach dem Start meiner zweiten Thread
ich bekommen:
Suspending all threads took: ms
Warnung gefolgt von:
Background sticky concurrent mark sweep GC freed 246745(21MB) AllocSpace objects, 169(6MB) LOS objects, 33% free, 31MB/47MB, paused 1.972ms total 127.267ms
Warnung.
Manchmal bekomme ich nur diese 2 Warnungen und andere mal bekomme ich eine Menge von diesen 2 Warnungen, bis ich entscheide, Sie zu beenden Sie die app ausführen. An diesem Punkt, es läuft gerade die wichtigsten Thread
und im Grunde nichts zu tun. Hier ist der relevante code:
MainActivity.java:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Getting html page through a thread
this.getHtmlPageThread = new GetHtmlPageThread(URL_STRING);
this.getHtmlPageThread.start();
//The thread that will search the web for data
this.getDataFromTheWebThread = new GetDataFromTheWebThread();
//Search button click listener
searchButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
//Get the searched lyrics
searchedLyrics = inputEditText.getText().toString();
informUserAboutConnectionToTheNet();
//Starting to search the web for data through a thread
getDataFromTheWebThread.start();
if (!getDataFromTheWebThread.isAlive())
{
printMap(MainActivity.matchResultMap);
}
}
}); //End of search button click listener
printMap(MainActivity.matchResultMap);
} //End of onCreate() method
protected void onStart()
{
super.onStart();
if (!this.isParseSucceeded()) //Connection to net failed
{
if (!getHtmlPageThread.isAlive()) //If the thread is not alive, start it.
{
getHtmlPageThread.start(); //Try to connect again
this.informUserAboutConnectionToTheNet();
}
}
if (!this.isParseSucceeded())
{
super.onStart(); //Call onStart() method
}
} //End of onStart() method
GetHtmlPageThread.java:
public class GetHtmlPageThread extends Thread
{
private String url;
public GetHtmlPageThread(String url)
{
this.url = url;
}
@Override
public void run()
{
try
{
MainActivity.htmlPage.setHtmlDocument(this.getParsedDocument(this.url));
if (MainActivity.htmlPage.getHtmlDocument() != null)
{
MainActivity.parsedSucceeded = true; //Parsed succeeded
}
else
{
MainActivity.parsedSucceeded = false; //Parsed failed
}
Thread.sleep(100);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
/**
* Returns the document object of the url parameter.
* If the connection is failed , return null.
*
* @param url Url to parse
* @return The document of the url.
*
*/
public Document getParsedDocument(String url)
{
try
{
return Jsoup.connect(url).get();
}
catch (IOException e) //On error
{
e.printStackTrace();
}
return null; //Failed to connect to the url
}
}
GetDataFromTheWeb.java:
public class GetDataFromTheWebThread extends Thread
{
public static boolean isFinished = false; //False - the thread is still running. True - the thread is dead
@Override
public void run()
{
GetDataFromTheWebThread.isFinished = false;
try
{
this.getLyricsPlanetDotComResults(MainActivity.searchedLyrics); //Method for internet computations
Thread.sleep(100);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
GetDataFromTheWebThread.isFinished = true;
}
...
}
Grundsätzlich die this.getLyricsPlanetDotComResults(MainActivity.searchedLyrics);
Methode in der zweiten Thread
ist dabei eine Menge von den internet-arbeiten und Berechnungen im Allgemeinen. Mehr Berechnungen als net-Zeug um genau zu sein.
So, ich glaube, ich habe diese Warnungen, weil der zweite Thread
ist viel zu "Beschäftigt"? Oder vielleicht auch nur meine Umsetzung mit dem activity-Lebenszyklus mit der onCreate()
Methode und onStart()
Methode sind falsch?
Unnötig zu sagen, habe ich nicht den output, den ich will, wenn ich Debuggen Sie die app und trat durch die zweite Thread
und es funktioniert Perfekt. Also nochmal, es hat etwas mit meiner Activity
's Umsetzung.
InformationsquelleAutor God | 2016-04-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die erste Zeile ist im Grunde sagen, dass der garbage collector (GC) entschieden, dass es notwendig auszusetzen, alle threads zu tun, etwas von seiner Arbeit (wie die Verlagerung von Variablen) und das dauerte einige Zeit. Normalerweise gibt es eine Zahl gibt es.
In der zweiten Zeile wird das Ergebnis der Sammlung. Es befreit einen angemessenen Betrag von Speicher, und Sie haben nun 1/3 Ihrer heap frei. Es benötigt Ihre app angehalten 2ms, und insgesamt verbrachte 127 ms sammeln von Müll.
GC an und für sich ist nicht schlecht. Aber wenn Sie es tun, die ganze Zeit, entweder du tust etwas, was mit viel Arbeitsspeicher benötigt, oder du tust etwas ineffizient. Heavy-string Parsen, vor allem für etwas wie JSoup können dazu führen, dass sich viele kleine Objekte (vor allem strings) gemacht werden, die wirklich notwendigen Aufräumarbeiten schnell auf einem kleinen Speicher-Gerät wie ein Telefon, so dass es nicht verwunderlich ist, hier zu sehen.
Im Grunde ist das nur ein problem, wenn Sie performance-Probleme von GC oder wenn du gehst OOM irgendwann. Wenn keines von beidem passiert sind, ich würde nicht sorgen über diese noch.
Thread
tut genau das, was ich will(**Zum aktualisieren einer globalen variable inMainActivity.java
) , ich weiß nur nicht, wenn ich auf Sie zugreifen kann(Wenn dieThread
ist getan, Es ist Arbeit) und wie(Denn ich benötigeLoop
-while (!myThread,isAlive()) {//Do my work}
, aber es ist eine gute Umsetzung? Auch ich thogh über die änderung derThread
zuHandlerThread
developer.android.com/intl/zh-cn/reference/android/os/... . Was denkst du? Danke.Wenn Sie wissen müssen, wenn der thread abgeschlossen ist, verwenden Sie einen Rückruf (oder wenn Sie eine Meldung auf dem UI-thread eine callback-gemacht von einem Handler auf dem UI-thread). HandlerThread ist mehr für einen thread, wo du gehst, es zu senden, eine Reihe von Veranstaltungen, die es hat, um darauf zu reagieren.
stackoverflow.com/questions/19366301/... so wie hier?
Oder hier stackoverflow.com/questions/3398363/...?
InformationsquelleAutor Gabe Sechan