これについて多くの質問がありますが、何も私を助けてくれませんでした。AsyncTask onPostExecute()は決して呼び出されません+ W:art:すべてのスレッドを中断しました:1.1ms
Jsoup
を使用して、一部のHTML
の解析を処理するAsyncTask
を取得しました。
doInBackground()
メソッドが呼び出された後、私は
onPostExecute()
方法が、
onPostExecute()
メソッドが呼び出されない問題に送信する値を取得します。
私はそれが私をスリップする単純なものだと思います。
関連するコードです。
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内部クラス:onPostExecuteに使用
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");
}
}
法():
public void setHtmlPage(HtmlPage htmlPage)
{
this.htmlPage = htmlPage;
}
HtmlPage.java:doInBackground()で使用
public class HtmlPage
{
private Document htmlDocument;
public HtmlPage(Document htmlDocument)
{
this.htmlDocument = htmlDocument;
}
}
方法:
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
}
私は推測する問題はonPostExecute()
メソッドを呼び出すための機会を得ることはありませんメインThread
ですか、 Generic
のパラメータがAsyncTask
であるか、またはAsyncTask
というクラスを実装したものです。
ご意見はお寄せください。
EDIT:
私はW/art: Suspending all threads took: 1.1ms
警告を忘れてしまいました。私はアプリを実行するためにそれを取得します。しかし、私はアプリをデバッグするとき私はそれを取得しないと私は明らかにdoInBackground()
メソッドで生成されているHtmlPage
オブジェクトが私が欲しい値を取得することがわかります。
onCreate()でタスクを開始した直後にタスクをキャンセルする理由は完全にはわかりませんが、これが問題になる可能性があります。 – Egor
@Egorもし私が 'AsyncTask'でないものが' HtmlPage'オブジェクトではない場合、私は 'AsyncTask'の実行をキャンセルします。そして、私はその行を削除しても、それはまったく同じままです。 – God
AsyncTaskは単なるasyncです。実行は別のスレッドで実行されるため、execute()を呼び出して次のコード行に結果を返すことはできません。 – Egor