[英]networkOnMainThreadException error even with Async
我在Android Studio上運行以下代碼,並嘗試對語義接口進行API調用。 這是我的異步代碼:
public class DownloadTest extends AsyncTask<Void, Void, Void> {
public String results = "hello";
public Products products = new Products("key",
"password");
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
// Call your web service here
Scan me = new Scan();
/* Build the Request */
products.productsField("upc", "883974958450").productsField("fields", "name", "gtins");
/* Make the Request */
try {
results = products.getProducts().toString();
Log.i("try", results);
me.set_vars(results); //set_vars is a method from MainActivity.java
} catch (Exception e) {
Log.i("myTag0", e.toString());
}
return null;
}
}
我沒有包括onPreExecute()或onPostExecute()的代碼,因為現在這些方法的代碼中沒有任何內容。
在myTag0的logcat中,我始終會看到networkOnMainThreadException,並且已經查看了其他線程,但仍然無法弄清為什么我確實收到此錯誤。 我在AndroidManifest中加入了正確的Internet權限,
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在MainActivity.java中,我通過以下方式調用方法doInBackground():
DownloadTest work = new DownloadTest();
work.doInBackground();
Log.i("mytag", my_result);
謝謝!
編輯:這是我將上面的語句更改為work.execute()時應用崩潰時收到的錯誤消息/跟蹤。
07-13 13:25:17.824 2718-2733/com.example.jesarshah.snapcart E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
Process: com.example.jesarshah.snapcart, PID: 2718
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:304)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:200)
at android.os.Handler.<init>(Handler.java:114)
at android.app.Activity.<init>(Activity.java:794)
at android.support.v4.app.FragmentActivity.<init>(FragmentActivity.java:76)
at android.support.v7.app.AppCompatActivity.<init>(AppCompatActivity.java:50)
at android.support.v7.app.ActionBarActivity.<init>(ActionBarActivity.java:23)
at com.example.jesarshah.snapcart.Scan.<init>(Scan.java:32)
at com.example.jesarshah.snapcart.DownloadTest.doInBackground(DownloadTest.java:26)
at com.example.jesarshah.snapcart.DownloadTest.doInBackground(DownloadTest.java:11)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:231)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor。 java:587),位於java.lang.Thread.run(Thread.java:818)
不要調用doInBackground()
。 從主應用程序線程調用execute()
或executeOnExecutor()
。
因為在您的情況下,您沒有onPostExecute()
或任何其他典型的AsyncTask
方法,並且由於希望執行此工作而位於后台線程中,所以:
只需在已有的后台線程上進行工作,然后完全擺脫AsyncTask
,或者
切換到普通Thread
還要注意,您的Scan
對象似乎是ActionBarActivity
的子類,或者正在創建ActionBarActivity
的實例。 這些都不可能。 切勿創建自己的活動實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.