ProgressBar in asynctask is not showing on upload
Asked Answered
H

2

2

Can someone tell me, why progressbar isnt showing when picture is being uploaded. I copied asynctask structure from my old project where it works. In my old project i use asynctask to download pictures from web server, and to show progressbar while downloading. Here is my code:

public class PreviewPostActivity extends Activity {

ImageView imageView;

TextView tvComment;
Button submit;
MyLocationListener locationListener;
List<NameValuePair> list = new ArrayList<NameValuePair>();
private final String url = "***"; //Url of php script
ProgressDialog pDialog;
String responseMessage="";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.preview_post);

    Intent intent = this.getIntent();
    imageView = (ImageView)findViewById(R.id.imgPerview);
    tvComment = (TextView)findViewById(R.id.txtPreviewComment);
    submit = (Button)findViewById(R.id.btnPreviewSubmit);

    Bitmap image = (Bitmap)intent.getParcelableExtra("picture");
    String comment = intent.getStringExtra("comment");
    locationListener = (MyLocationListener)intent.getSerializableExtra("location");
    String imagePath = intent.getStringExtra("imagePath");
    String date = intent.getStringExtra("date");

    imageView.setImageBitmap(image);
    tvComment.setText(comment);

    //tvComment.append("\n"+locationListener.latitude + "\n"+locationListener.longitude);

    list.add(new BasicNameValuePair("image", imagePath));
    list.add(new BasicNameValuePair("comment", comment));
    list.add(new BasicNameValuePair("longitude", Double.toString(locationListener.longitude)));
    list.add(new BasicNameValuePair("latitude", Double.toString(locationListener.latitude)));
    list.add(new BasicNameValuePair("date", date));

    submit.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            new uploadPost().execute();

        }
    });

}

public void post(List<NameValuePair> nameValuePairs) {
    HttpParams httpParameters = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(httpParameters, 100000);
    HttpConnectionParams.setSoTimeout(httpParameters, 200000);
    HttpClient httpClient = new DefaultHttpClient(httpParameters);
    HttpContext localContext = new BasicHttpContext();
    HttpPost httpPost = new HttpPost(url);

    try {
        MultipartEntity entity = new MultipartEntity();

        for(int index=0; index < nameValuePairs.size(); index++) {
            if(nameValuePairs.get(index).getName().equalsIgnoreCase("image")) {
                // If the key equals to "image", we use FileBody to transfer the data

                entity.addPart(nameValuePairs.get(index).getName(), new FileBody(new File(nameValuePairs.get(index).getValue()),"image/jpeg"));
            } else {
                // Normal string data
                entity.addPart(nameValuePairs.get(index).getName(), new StringBody(nameValuePairs.get(index).getValue()));
            }
        }

        httpPost.setEntity(entity);

        HttpResponse response = httpClient.execute(httpPost, localContext);
        HttpEntity httpEntity = response.getEntity();
        String responseMessage = EntityUtils.toString(httpEntity);

        tvComment.setText(responseMessage);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

class uploadPost extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(PreviewPostActivity.this);
        pDialog.setMessage("Uploading post. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    /**
     * Getting product details in background thread
     * */
    protected String doInBackground(String... params) {

        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {

                    //post(list);
                HttpParams httpParameters = new BasicHttpParams();
                HttpConnectionParams.setConnectionTimeout(httpParameters, 100000);
                HttpConnectionParams.setSoTimeout(httpParameters, 200000);
                HttpClient httpClient = new DefaultHttpClient(httpParameters);
                HttpContext localContext = new BasicHttpContext();
                HttpPost httpPost = new HttpPost(url);

                try {
                    MultipartEntity entity = new MultipartEntity();

                    for(int index=0; index < list.size(); index++) {
                        if(list.get(index).getName().equalsIgnoreCase("image")) {
                            // If the key equals to "image", we use FileBody to transfer the data

                            entity.addPart(list.get(index).getName(), new FileBody(new File(list.get(index).getValue()),"image/jpeg"));
                        } else {
                            // Normal string data
                            entity.addPart(list.get(index).getName(), new StringBody(list.get(index).getValue()));
                        }
                    }

                    httpPost.setEntity(entity);

                    HttpResponse response = httpClient.execute(httpPost, localContext);
                    HttpEntity httpEntity = response.getEntity();
                    responseMessage = EntityUtils.toString(httpEntity);

                    //tvComment.setText(responseMessage);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once got all details
        tvComment.setText(responseMessage);
        pDialog.dismiss();
    }
}

So when i hit button for upload, screen freezes and stay frozen until upload is complete, and progress bar isnt showing at all. Sometimes it shows, but its rly rear and i dont know why. I have tried calling Post() method from class in doInBackground body insted of whole code (code in body is the same as in post() method) but effect is the same, so i guess i didnt do something right in creating progressbar. But again i say i copied whole asynctask code from old project in witch it worked fine.

EDIT:

I just tryed creating progress bar in constructor of PreviewPostActivity.class and after that i made constructor for asynctask class but it still dosent work. I am rly confused becouse it worked in my old program. Here is code from him:

class GetSlike extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(KlubSlikeActivity.this);
        pDialog.setMessage("Ucitavanje u toku. Molimo vas sacekajte...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    /**
     * Getting product details in background thread
     * */
    protected String doInBackground(String... params) {

        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {

                    String id = Integer.toString(k.getId());
                    List<NameValuePair> params = new ArrayList<NameValuePair>();
                    params.add(new BasicNameValuePair("klub",id));

                    slikeUrl = JSONAdapter.getSlike(params);
                    gv.setAdapter(new SlikeAdapter(slikeUrl,KlubSlikeActivity.this));
            }
        });

        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once got all details
        pDialog.dismiss();
    }
}

Only thing changed is doInBackground body...

Edited:

Dialog is display after runOnUiThread() is executed.

Hour answered 22/3, 2013 at 14:24 Comment(8)
asynctask runs in background.you have to update ui in onPostExecute()Lateen
developer.android.com/reference/android/os/AsyncTask.html. see the 4 steps.Lateen
i dismiss progressbar in onPostExecute();.Hour
and i create pBar on onPreExecute and .show() it, but it doesent show at allHour
its like he is not doing thread in background at allHour
#15522240. Check the answer for sample in the edit for reference.Lateen
@Lateen i want to update ui in background and show after updated.Somatoplasm
check this tutorial : android-ios-tutorials.com/182/…Michalemichalski
L
4

Run on ui thread in asynctask doinbackground() is not correct. Also you are returning null in doInBackground() and you have parameter file_url in onPostExecute(). Return value in doInbackground() recieve value in onPostExecute().

doInBackGround() runs in background so you cannot access or update ui here.

To update ui you can use onPostExecute().

Your AsyncTask should be something like below. You are doing it the wrong way.

http://developer.android.com/reference/android/os/AsyncTask.html. See the topic under The 4 steps

 pd= new ProgressDialog(this);
 pd.setTitle("Posting data");
 new PostTask().execute();

private class PostTask extends AsyncTask<VOid, Void, Void> {

protected void onPreExecute()
{//display dialog.
  pd.show();
}
protected SoapObject doInBackground(Void... params) {
// TODO Auto-generated method stub
       //post request. do not update ui here. runs in background
return null;
}

protected void onPostExecute(Void param)
{   

 pd.dismiss();
 //update ui here
}
Lateen answered 22/3, 2013 at 14:40 Comment(5)
ur making ui changes in doInBackground(). do in background runs in background thread. So update ui on postexecute. Also remove runonuithread in doInBackground().Lateen
can u plz c/p lines in witch i update ui from doInBackground couse i cant see them, or i dont understand... i dont knowHour
I solved it. Problem was in runOnInThread. When i removed it it started working. Thank you for help, u get my vote. CheersHour
you can click on the up arrow when you hover to left of the commentLateen
i guess i dont have enough reputation to vote up... so ill vote up when i get enough dont worry. thx againHour
C
6

I found this library which is perfect to accomplish the upload task and also provide a progress handler which could be used to set the value of a ProgressBar:

https://github.com/nadam/android-async-http

It could be used like the following... Set onClickHandler for the upload Button:

@Override
public void onClick(View arg0) {
    try {
        String url = Uri.parse("YOUR UPLOAD URL GOES HERE")
                .buildUpon()
                .appendQueryParameter("SOME PARAMETER IF NEEDED 01", "VALUE 01")
                .appendQueryParameter("SOME PARAMETER IF NEEDED 02", "VALUE 02")
                .build().toString();

        AsyncHttpResponseHandler httpResponseHandler = createHTTPResponseHandler();

        RequestParams params = new RequestParams();
        // this path could be retrieved from library or camera
        String imageFilePath = "/storage/sdcard/DCIM/Camera/IMG.jpg";
        params.put("data", new File(imageFilePath));

        AsyncHttpClient client = new AsyncHttpClient();
        client.post(url, params, httpResponseHandler);
    } catch (IOException e) {
        e.printStackTrace();                
    }
}

then add this method to your activity code:

public AsyncHttpResponseHandler createHTTPResponseHandler() {
    AsyncHttpResponseHandler handler = new AsyncHttpResponseHandler() {
        @Override
        public void onStart() {
            super.onStart();
        }

        @Override
        public void onProgress(int position, int length) {
            super.onProgress(position, length);

            progressBar.setProgress(position);
            progressBar.setMax(length);
        }

        @Override
        public void onSuccess(String content) {
            super.onSuccess(content);
        }

        @Override
        public void onFailure(Throwable error, String content) {
            super.onFailure(error, content);
        }

        @Override
        public void onFinish() {
            super.onFinish();
        }
    };

    return handler;
}
Cleliaclellan answered 10/10, 2013 at 12:26 Comment(0)
L
4

Run on ui thread in asynctask doinbackground() is not correct. Also you are returning null in doInBackground() and you have parameter file_url in onPostExecute(). Return value in doInbackground() recieve value in onPostExecute().

doInBackGround() runs in background so you cannot access or update ui here.

To update ui you can use onPostExecute().

Your AsyncTask should be something like below. You are doing it the wrong way.

http://developer.android.com/reference/android/os/AsyncTask.html. See the topic under The 4 steps

 pd= new ProgressDialog(this);
 pd.setTitle("Posting data");
 new PostTask().execute();

private class PostTask extends AsyncTask<VOid, Void, Void> {

protected void onPreExecute()
{//display dialog.
  pd.show();
}
protected SoapObject doInBackground(Void... params) {
// TODO Auto-generated method stub
       //post request. do not update ui here. runs in background
return null;
}

protected void onPostExecute(Void param)
{   

 pd.dismiss();
 //update ui here
}
Lateen answered 22/3, 2013 at 14:40 Comment(5)
ur making ui changes in doInBackground(). do in background runs in background thread. So update ui on postexecute. Also remove runonuithread in doInBackground().Lateen
can u plz c/p lines in witch i update ui from doInBackground couse i cant see them, or i dont understand... i dont knowHour
I solved it. Problem was in runOnInThread. When i removed it it started working. Thank you for help, u get my vote. CheersHour
you can click on the up arrow when you hover to left of the commentLateen
i guess i dont have enough reputation to vote up... so ill vote up when i get enough dont worry. thx againHour

© 2022 - 2024 — McMap. All rights reserved.