我是android新手。我正在尝试在向服务器发送照片时在aysnc任务中显示进度条,我想创建与文件一样多的进度条,这些进度条将根据发送到服务器的字节数百分比来更改状态。我进行了搜索,发现了一些与此相关的问题,但无法修改我的代码,问题是按下按钮后进度条没有显示。
这是我的代码
public class HttpUploader extends AsyncTask<String, Void, String> {
/*----------------------
i followed some questions and here i have tried something but caused me an error
private ProgressDialog dialog;
private Context context;
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(context);
dialog.setMessage("Uploading...");
dialog.setIndeterminate(false);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setProgress(0);
dialog.show();
}
protected void onPostExecute(final Boolean success) {
if (dialog.isShowing()) {
dialog.dismiss();
}
}-------------------------*/
protected String doInBackground(String... path) {
String outPut = null;
for (String sdPath:path) {
Bitmap bitmapOrg = BitmapFactory.decodeFile(sdPath);
ByteArrayOutputStream bao = new ByteArrayOutputStream();
//Resize the image
double width = bitmapOrg.getWidth();
double height = bitmapOrg.getHeight();
double ratio = 400/width;
int newheight = (int)(ratio*height);
// System.out.println("———-width" + width);
//System.out.println("———-height" + height);
bitmapOrg = Bitmap.createScaledBitmap(bitmapOrg, 400, newheight, true);
//Here you can define .PNG as well
bitmapOrg.compress(Bitmap.CompressFormat.JPEG, 95, bao);
byte[] ba = bao.toByteArray();
String ba1 = Base64.encodeToString(ba, 0);
//System.out.println("uploading image now ——–" + ba1);
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("image", ba1));
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://imageuplaod");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
// print responce
outPut = EntityUtils.toString(entity);
Log.i("GET RESPONSE—-", outPut);
//is = entity.getContent();
Log.e("log_tag ******", "good connection");
bitmapOrg.recycle();
} catch (Exception e) {
Log.e("log_tag ******", "Error in http connection " + e.toString());
}
}
return outPut;
}
}
我的MainActivity
班
public class MainActivity extends Activity{
Uri currImageURI;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button upload_btn = (Button) this.findViewById(R.id.uploadButton);
upload_btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
upload();
}});
}
public void upload(){
ArrayList<Uri> fileName = getFileList();
for ( int i = 0 ; i < fileName.size() ; i++ )
{
HttpUploader uploader = new HttpUploader();
try {
uploader.execute(getRealPathFromURI(fileName.get(i))).get();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
TextView tv_path = (TextView) findViewById(R.id.path);
tv_path.setText(getRealPathFromURI(currImageURI));
}
public String getRealPathFromURI(Uri contentUri) {
String [] proj={MediaStore.Images.Media.DATA};
android.database.Cursor cursor = managedQuery( contentUri,
proj, // Which columns to return
null, // WHERE clause; which rows to return (all rows)
null, // WHERE clause selection arguments (none)
null); // Order-by clause (ascending by name)
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
private ArrayList<Uri> getFileList()
{
ArrayList<Uri> fileList = new ArrayList<Uri>();
try
{
String[] proj = { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID };
Cursor actualimagecursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, proj,
null, null, MediaStore.Images.Media.DEFAULT_SORT_ORDER);
int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
for ( int i = 0 ; i < actualimagecursor.getCount() ; i++ )
{
actualimagecursor.moveToPosition(i);
String fileName = actualimagecursor.getString(actual_image_column_index);
fileList.add(( Uri.withAppendedPath( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, fileName )));
//fileName = ( Uri.withAppendedPath( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, fileName ).toString() );
}
return fileList;
}
catch ( Exception e )
{
return null;
}
}
}
答案 0 :(得分:0)
尝试异步运行asyncTask。不要使用“get()”函数。相反,通过“onPostExecute”回调获得结果。
答案 1 :(得分:0)
进度条包含进度号/百分比/其他:
pg = new ProgressDialog(this);
pg.setCancelable(false);
pg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pg.setProgress(0);
pg.setMax(100);
pg.setMessage("Loading...");
pg.show();
private class someAsyncClass extends AsyncTask<String, String, Void> {
@Override
protected Void doInBackground(String... params) {
int percent = calchowfaryouare;
publishProgress("Loading... "+percent+"%");
}
@Override
protected void onProgressUpdate(String... progress) {
super.onProgressUpdate(progress);
if (pg != null) {
pg.setMessage(progress[0]);
pg.show();
}
}
}
编辑:您的问题是,在您的注释代码中,您使用了上下文,但在您的情况下,它将为null。你永远不会为此分配东西。如果您在Activity中调用异步任务,只需使用类似MainActivity.this或getApplication()的内容。
编辑2:
所以我认为HttpUploader在一个单独的文件中是正确的吗? 如果是这样,最简单的方法是将其复制到MainActivity中。 只需在最后一次'}'之前插入即可。 只需将“上下文上下文”更改为“上下文上下文= MainActivity.this”。
您也可以只将一个构造函数插入到该类中,并将HttpUploader嵌套在自己的文件中,但这可能会更复杂。
答案 2 :(得分:0)
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
dialog.setProgress(values[0]);
}
在doInBackground中:
publishProgress(someValue);
答案 3 :(得分:0)
使用此代码在aysnc Task的onPreExecute()中显示进度条。
pDialog = new ProgressDialog(XMPPChatDemoActivity.this);
pDialog.setMessage("Downloading file. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setMax(100);
pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pDialog.setCancelable(true);
pDialog.show();
并在onPostExecute()方法中调用它为pDialog.dissmiss();
根据你设置ProgressDialog样式和setCancelable()。