![](/img/trans.png)
[英]“android.os.NetworkOnMainThreadException” when trying to connect over WiFi using Calimero Java Library
[英]NetworkOnMainThreadException when trying to abort
我有一個AsyncTask,它從URL提取數據時會彈出一個對話框,如果對話框關閉,則有一個處理程序來取消請求。 它在大多數情況下都能正常工作,但我發現它偶爾會因NetworkOnMainThreadException而崩潰。 我的理論是,如果對話框在doInBackground()完成之后但在onPostExecute()運行之前或同時被取消,則CancelListener在主線程上運行。 那該理論有意義嗎,我將如何正確處理呢? 嘗試趕上?
這是一個示例代碼:
public class TestTask extends AsyncTask<Void, Void, Void>
{
public ProgressDialog dialog;
public Context context;
public HttpUriRequest request;
public TestTask(Activity activity)
{
context = activity;
}
@Override
protected void onCancelled()
{
if (dialog != null)
dialog.dismiss();
super.onCancelled();
}
@Override
protected void onPreExecute()
{
OnCancelListener cancelListener = new OnCancelListener()
{
@Override
public void onCancel(DialogInterface dialog)
{
if (request != null)
request.abort(); // this causes NetworkOnMainThreadException sometimes
TestTask.this.cancel(true);
}
};
dialog = ProgressDialog.show(context, "", "Loading", true, true, cancelListener);
dialog.setCanceledOnTouchOutside(false);
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params)
{
String url = "some url";
request = new HttpGet(url);
// process request
return null;
}
@Override
protected void onPostExecute(Void result)
{
dialog.dismiss();
super.onPostExecute(result);
}
}
我不會在這里嘗試/捕獲-這只會解決問題,在這種情況下不會中止操作。 您可以例如生成線程來中止操作
嘗試在中止之前取消請求
@Override
public void onCancel(DialogInterface dialog)
{
TestTask.this.cancel(true);
if (request != null)
request.abort(); // this causes NetworkOnMainThreadException sometimes
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.