簡體   English   中英

即使使用異步,networkOnMainThreadException錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM