2015-11-24 41 views
-1

我從登錄屏幕獲取用戶名。我想打電話給Web服務來驗證用戶。問題是,我得到的錯誤:Android登錄和如何使網絡阻塞呼叫

android.os.NetworkOnMainThreadException

我知道爲什麼我得到它。我正在主線程上進行網絡調用。

問題是我不想使用AsyncTask。我不希望用戶能夠登錄之前我收到來自Web服務的響應。

我該如何解決這個問題?

+2

顯示'AsyncTask'完成執行後的登錄屏幕。 –

+0

如果你不想使用'AsyncTask',你也可以使用'RxJava'作爲例子,這樣就可以輕鬆地將工作轉移到某個側面線程,並將結果返回到主線程。 – ehehhh

+1

您無法在主線程上進行網絡通話。你必須異步做到這一點。阻止UI元素,直到異步任務完成。 – shiladitya

回答

1

當用戶使用「等待」片段打開第一個活動時,可以開始AsyncTaskAsyncTask完成後,您可以切換到「登錄」片段。

0

只有當您從Web服務獲得響應時,才能使用AsyncTask登錄。

class SignInAsyncTask extends AsyncTask<Void, Void, String> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // Display a progress bar saying signing in or something 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     // Call your web service 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     // Sign in if the credentials are okay, otherwise show some error message to the user 
    } 
} 

如果你真的不想使用AsyncTask你可以開始一個新的線程,並在這裏把你的邏輯。

new Thread(new Runnable() { 

    public void run() { 
     // Sign in validation 
    } 
}).start();