You and Your Main Thread

Networking does not happen immediately. A web server may take as long as a second or two to respond, and a file download can take even longer than that. Because networking can take so long, Android disallows all networking on the main thread. If you try to do it, Android will throw a NetworkOnMainThreadException.

Why? To understand that, you need to understand what a thread is, what the main thread is, and what the main thread does.

A thread is a single sequence of execution. Code running within a single thread will execute one step after another. Every Android app starts life with a main thread. The main thread, however, is not a preordained list of steps. Instead, it sits in an infinite loop and waits for events initiated by the user or the system. Then it executes code in response to those events as they occur (Figure 25.6).

Figure 25.6  Regular threads vs the main thread

Figure shows the difference between a regular thread and main thread.

Imagine that your app is an enormous shoe store, and that you only have one employee – The Flash. (Who hasn’t dreamed of that?) There are a lot of things to do in a store to keep the customers happy: arranging the merchandise, fetching shoes for customers, wielding the Brannock device. With The Flash as your salesperson, everyone is taken care of in a timely fashion, even though there is only one guy doing all the work.

For this situation to work, The Flash cannot spend too much time doing any one thing. What if a shipment of shoes goes missing? Someone will have to spend a lot of time on the phone straightening it out. Your customers will get mighty impatient waiting for shoes while The Flash is on hold.

The Flash is like the main thread in your application. It runs all the code that updates the UI. This includes the code executed in response to different UI-related events – activity startup, button presses, and so on. (Because the events are all related to the UI in some way, the main thread is sometimes called the UI thread.)

The event loop keeps the UI code in sequence. It makes sure that none of these operations step on each other while still ensuring that the code is executed in a timely fashion. So far, all of the code you have written (except for the code you just wrote with AsyncTask) has been executed on the main thread.

Beyond the main thread

Networking is a lot like a phone call to your shoe distributor: It takes a long time compared to other tasks. During that time, the UI will be completely unresponsive, which might result in an application not responding, or ANR.

An ANR occurs when Android’s watchdog determines that the main thread has failed to respond to an important event, like pressing the Back button. To the user, it looks like Figure 25.7.

Figure 25.7  Application not responding

Screenshot shows Application not responding. The Popup message reads, PhotoGallery isn't responding. The options read, Close App, and Wait.

In your store, you would solve the problem by (naturally) hiring a second Flash to call the shoe distributor. In Android, you do something similar – you create a background thread and access the network from there.

And what is the easiest way to work with a background thread? Why, AsyncTask.

You will get to see other things AsyncTask can do later this chapter. Before you do that, you will want to do some real work with your networking code.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.207.163.25