Riskhan
Riskhan

Reputation: 4470

android app shows blank screen (not updating ui) while in a loop

In my application, a client is connected to server. It waits until the connection to the server occurs. During that time the application is not responding. How can i solve this problem. Tried code snippet shows below

public Connection(){
    client.SetParent(this);
    this.context = g.getContext();
    bConnected = false;

    mNetworkRunner = new Runnable() {
        public void run() {
            try {
                Log.e("", "mNetworkRunner...");

                if( SendKeepAlive()){
                    Main.conStatus(1);
                    Log.e("", "SendKeepAlive...");
                }
                else {
                    Main.conStatus(0);
                    Log.e("", "No connection...");

                    g.log("Connection to server is lost... Trying to Connect...");
                    while(true){
                        Log.e("", "In while loop...");

                        if(!Connect()){
                            g.log("Trying...");
                            Log.e("", "In Connect no connect...");
                            Thread.sleep(2000);
                        }
                        else {
                            g.log("Connected");
                            break;
                        }

                    }
                    Main.conStatus(1);
                }
                mNetworkHandler.postDelayed(this, 30000);
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    };      

}
// 
private void CheckNetworkConnection(){
    if( mNetworkHandler == null ){
        mNetworkHandler = new Handler();
        mNetworkHandler.post(mNetworkRunner);
        Log.e("", "CheckNetworkConnection...");
    }       
}

Upvotes: 0

Views: 600

Answers (2)

Mukesh Kumar Singh
Mukesh Kumar Singh

Reputation: 4522

You are doing a lot of time consuming work in UI Thread, which create problem. In this situation you should use AsyncTask.

AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {

    //do your time consuming task here
     }

     protected void onProgressUpdate(Integer... progress) {
         //setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         //showDialog("Downloaded " + result + " bytes");
     }
 }

Once created, a task is executed very simply:

 new DownloadFilesTask().execute(url1, url2, url3);

Upvotes: 2

Jiang Qi
Jiang Qi

Reputation: 4448

mNetworkHandler = new Handler() will make Runnable execute on UI Thread, you need HandlerThread

private void CheckNetworkConnection(){
    if( mNetworkHandler == null ){
        HandlerThread handlerThread = new HandlerThread("thread");
        handlerThread.start();
        mNetworkHandler =  new Handler(handlerThread.getLooper());
        mNetworkHandler.post(mNetworkRunner);
        Log.e("", "CheckNetworkConnection...");
    }
}

Upvotes: 1

Related Questions