我從登錄屏幕獲取用戶名。我想打電話給Web服務來驗證用戶。問題是,我得到的錯誤:Android登錄和如何使網絡阻塞呼叫
android.os.NetworkOnMainThreadException
我知道爲什麼我得到它。我正在主線程上進行網絡調用。
問題是我不想使用AsyncTask
。我不希望用戶能夠登錄之前我收到來自Web服務的響應。
我該如何解決這個問題?
我從登錄屏幕獲取用戶名。我想打電話給Web服務來驗證用戶。問題是,我得到的錯誤:Android登錄和如何使網絡阻塞呼叫
android.os.NetworkOnMainThreadException
我知道爲什麼我得到它。我正在主線程上進行網絡調用。
問題是我不想使用AsyncTask
。我不希望用戶能夠登錄之前我收到來自Web服務的響應。
我該如何解決這個問題?
當用戶使用「等待」片段打開第一個活動時,可以開始AsyncTask
。 AsyncTask
完成後,您可以切換到「登錄」片段。
只有當您從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();
顯示'AsyncTask'完成執行後的登錄屏幕。 –
如果你不想使用'AsyncTask',你也可以使用'RxJava'作爲例子,這樣就可以輕鬆地將工作轉移到某個側面線程,並將結果返回到主線程。 – ehehhh
您無法在主線程上進行網絡通話。你必須異步做到這一點。阻止UI元素,直到異步任務完成。 – shiladitya