进度中的AsyncTask没有显示在上传(ProgressBar in asynctask is n

2019-07-22 16:55发布

谁能告诉我,为什么画面被上传时显示进度条心不是。 我从我的老项目中,它的工作原理复制的AsyncTask结构。 在我的老项目中,我使用的AsyncTask下载从服务器上的图片,并显示进度,同时下载。 这里是我的代码:

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();
    }
}

所以,当我打键上传,画面冻结,保持冻结,直到上传完成后,和进度条显示的心不是在所有。 有时它显示了,但其RLY后,我不知道为什么。 我已经打过电话后从类()方法在doInBackground体insted的整体代码(机身码是一样的post()方法),但效果是一样的,所以我想我没有做一些正确的事情创建进度。 但我又告诉我复制从旧项目在巫婆它工作得很好整个的AsyncTask代码。

编辑:

我只是tryed创建进度条PreviewPostActivity.class的构造之后,我做出构造函数的AsyncTask类,但它仍然dosent工作。 我RLY困惑becouse它在我的旧程序的工作。 下面是从他的代码:

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();
    }
}

唯一改变的是doInBackground体...

编辑:

对话框是显示后runOnUiThread()被执行。

Answer 1:

在的AsyncTask doinbackground UI线程)上运行(不正确。 另外你在doInBackground返回null(),你有参数FILE_URL在onPostExecute()。 在onPostExecute返回doInbackground()收到值的值()。

doInBackGround()在后台运行,所以你不能访问或在这里更新UI。

要更新的用户界面,您可以使用onPostExecute()。

您的AsyncTask应该像下面。 你是做了错误的方式。

http://developer.android.com/reference/android/os/AsyncTask.html 。 请参阅下的4个步骤的话题

 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
}


Answer 2:

我发现这个库,是完美的完成上传任务,并提供可用于设定值的进度处理ProgressBar

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

它可以用来像下面...设置onClickHandler的上传按钮:

@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();                
    }
}

那么这种方法添加到您的活动代码:

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;
}


文章来源: ProgressBar in asynctask is not showing on upload