Rashedul Rough
Rashedul Rough

Reputation: 99

How to call a asyncTask several times inside a loop- one after another

Actually what i am trying to do is that call an asyncTask several times inside a loop. So, first time the asyncTask will start immediately and from second time onwards, it will check whether the AsyncTask has been finished-if finished than again call it with different values.

Below is my code for the activity:

In onCreate()

btnUpload.setOnClickListener(new View.OnClickListener() 
 {
    @Override
    public void onClick(View v) 
       {
        count_response = 0;
        newUploadWithSeparate();
      }
 });   

The newUploadWithSeparate() method:

private void newUploadWithSeparate()
        {
            responseString_concat = "";

            if(filePath.length > 0)
            {
                for(int i=0;i<filePath.length;i++)
                {
                    count_response = i;

                    if(i == 0)
                    {
                        uploadAsync.execute(filePath[0]);

                        mHandler = new Handler() { 
                            @Override public void handleMessage(Message msg) { 
                                String s=(String)msg.obj;

                                  Log.d("logIMEI","\n Response from Asynctask:  " + s);

                                str_response_fromAsync = s;

                            }
                        };
                    }
                    else
                    {
                        uploadAsync.getStatus();

                        while(uploadAsync.getStatus() == AsyncTask.Status.RUNNING) // this while loop is just to keep the loop  value waitining for finishing the asyncTask
                        {
                            int rx = 0; 
                        }

                        if(uploadAsync.getStatus() != AsyncTask.Status.RUNNING)
                        {
                            if(uploadAsync.getStatus() == AsyncTask.Status.FINISHED)
                                {
                                    if(str_response_fromAsync != "" || !str_response_fromAsync.equals("") || !str_response_fromAsync.isEmpty())
                                       {
                                        uploadAsync.execute(filePath[i]);

                                        x = i;

                                        mHandler = new Handler() { 
                                            @Override public void handleMessage(Message msg) 
                                            { 
                                                String s=(String)msg.obj;

                                                  Log.d("logIMEI","\n Response from Asynctask_" + x + ": "  + s);

                                                str_response_fromAsync = s;

                                            }
                                        };


                                       }
                                }
                        }
                    }

                 }
            }
        }

And the asyncTask:

private class UploadFileToServer extends AsyncTask<String, Integer, String> 
        {
            @Override
            protected void onPreExecute() 
            {
                super.onPreExecute();
            }


            @Override
            protected String doInBackground(String... params) 
            {
                return uploadFile(params[0]);
            }

            private String uploadFile(String pr)
            {
                //inside here calling webservice and getting a response string as result.        
                    MyWebsrvcClass mycls = new MyWebsrvcClass();
                    return responseString_concat = mycls.Call(xxx,yyy) ;
            } 

            @Override        
            protected void onPostExecute(String result) 
            {
                Log.d("logIMEI" , "\n count_response : "+ count_response + "  fileprath_len : " + filePath.length);

                    Message msg=new Message();
                    msg.obj=result.toString();
                    mHandler.sendMessage(msg);

                super.onPostExecute(result);  
            } 
        }

Now the problem is that its not working as expected. The first time when value of i is equals 0 than the AsyncTask gets called and after that its not getting called anymore.

Plus, when first time AsyncTask is called- its still not directly entering to onPostExecute(). When the loop ends totally and newUploadWithSeparate() method ends then the onPostExecute() is working.

Any solutions for this or any other way to do this job done for using AsyncTask inside loop?

Upvotes: 0

Views: 978

Answers (1)

Ankit Aggarwal
Ankit Aggarwal

Reputation: 5375

You cannot call execute() on the same object more than once. So create a new instance of UploadFileToServer for each iteration of the loop.

Upvotes: 1

Related Questions