Ich weiß, es gibt eine Menge von AsyncTask
Fragen dazu, aber keine geschah mir zu helfen.AsyncTask onPostExecute() wird nie aufgerufen + W/art: Suspending alle Threads nahm: 1.1ms
Ich habe eine AsyncTask
, die einige HTML
Parsing mit Jsoup
behandelt.
ich gedebuggt die App unzählige Male (wirklich) und nach doInBackground()
Methode i die Werte i bis onPostExecute()
Methode senden möchten bekommen genannt, aber das Problem der onPostExecute()
Methode nie aufgerufen.
Ich denke, es ist etwas einfaches, das durch mich gleiten.
Nur relevanten Code.
MainActivity.java:
private HtmlPage htmlPage = new HtmlPage();
private static final String ASYNC_TASK_TAG = "AsyncTask";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Getting the HTML document from a background thread
new GetHtmlDocument("someUrlString").execute();
if (this.htmlPage.getHtmlDocument() != null)
{
new GetHtmlDocument("someUrlString").cancel(true);
}
while (this.htmlPage.getHtmlDocument() == null)
{
if (this.htmlPage.getHtmlDocument() != null)
{
new GetHtmlDocument("someUrlString").cancel(true);
}
else
{
new GetHtmlDocument("someUrlString").execute();
}
}
}
AsyncTask innere Klasse:
private class GetHtmlDocument extends AsyncTask<String,Void,HtmlPage>
{
private String url;
/**
* Constructor.
*
* @param url Url to parse from in the web.
*/
public GetHtmlDocument(String url)
{
this.url = url;
}
@Override
protected void onPreExecute()
{
Log.d(MainActivity.ASYNC_TASK_TAG, "onPreExecute() called");
}
@Override
protected HtmlPage doInBackground(String... params)
{
//android.os.Debug.waitForDebugger();
Log.d(MainActivity.ASYNC_TASK_TAG, "doInBackground() called");
// Get the HTML http://www.lyricsplanet.com/ document
HtmlPage htmlPage = new HtmlPage(getParsedDocument(this.url));
return htmlPage;
}
@Override
protected void onPostExecute(HtmlPage htmlPage)
{
Log.d(MainActivity.ASYNC_TASK_TAG, "onPostExecute() called");
if (htmlPage.getHtmlDocument() != null)
{
this.cancel(true);
}
setHtmlPage(htmlPage);
}
/**
* A task can be cancelled at any time by invoking cancel(boolean).
* Invoking this method will cause subsequent calls to isCancelled() to return true.
* After invoking this method, onCancelled(Object), instead of onPostExecute(Object) will be invoked after doInBackground(Object[]) returns.
* To ensure that a task is cancelled as quickly as possible, you should always check the return value of isCancelled() periodically from doInBackground(Object[]), if possible (inside a loop for instance.)
*
* @param htmlPage
*
*/
@Override
protected void onCancelled(HtmlPage htmlPage)
{
Log.d(MainActivity.ASYNC_TASK_TAG, "onCancelled() called");
}
}
Methode verwendet, in OnPostExecute():
public void setHtmlPage(HtmlPage htmlPage)
{
this.htmlPage = htmlPage;
}
HtmlPage.java:
public class HtmlPage
{
private Document htmlDocument;
public HtmlPage(Document htmlDocument)
{
this.htmlDocument = htmlDocument;
}
}
Methode, die in doInBackground verwendet():
public Document getParsedDocument(String url)
{
try
{
return Jsoup.connect(url).get();
}
catch (IOException e) // On error
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
return null; // Failed to connect to the url
}
Ich denke, das Problem ist, mit dem Haupt Thread
, die nie eine Chance onPostExecute()
Methode aufrufe werden oder etwas mit den Generic
Parametern meiner AsyncTask
oder etwas mit meiner Implementierung meiner AsyncTask
Klasse.
Alle Vorschläge werden sehr geschätzt.
EDIT:
ich vergaß die W/art: Suspending all threads took: 1.1ms
Warnung. Ich bekomme das zum Ausführen der App. Aber wenn ich die App debuggen bekomme ich das nicht und ich sehe deutlich, dass das HtmlPage
Objekt, das in der doInBackground()
Methode generiert wurde, den Wert bekomme, den ich will.
Es ist nicht ganz klar, warum Sie die Aufgabe gleich nach dem Start in onCreate() abbrechen, dies könnte das Problem sein. – Egor
@Egor Wenn ich bekomme, was ich wollte von der 'AsyncTask', die ein nicht null' HtmlPage' Objekt ist, lehne ich einfach die 'AsyncTask' Ausführung ab. Und BTW, auch wenn ich diese Zeile entferne, bleibt es genau gleich. – God
AsyncTask ist nur das - async, die Ausführung läuft auf einem anderen Thread, so dass Sie nicht erwarten können, execute() aufzurufen und das Ergebnis in der nächsten Codezeile zu haben. – Egor