Android:如何在向服务器

时间:2016-06-24 07:22:24

标签: android

嗨我在搜索我的问题的解决方案时感到沮丧。我的问题是我有一个gridview来显示我从gallery中选择的所有图像。我想在gridview中的每个图像上显示进度条。并在使用图像上传图像到服务器时multipart我想要更新进度条..

我在每个图片视图上显示了进度条,但我无法在每个进度条上显示进度。

所以请帮我展示如何在每个图像视图中显示进度条及其各自的过程。

提前致谢

2 个答案:

答案 0 :(得分:1)

为观察者创建一个界面:

interface ProgressListener {
  void onProgressUpdate(String imagePath, int progress);
}

让视图持有者实现该观察者并知道图像路径:

public class ViewHolder implements ProgressListener {
   ImageView imgQueue;
   ProgressBar pb;
   TextView tv;
   String imagePath; //set this in getView!

   void onProgressUpdate(String imagePath, int progress) {
       if (!this.imagePath.equals(imagePath)) {
          //was not for this view
          return;
       }

       pb.post(new Runnable() {
         pb.setProgress(progress);
       });
   }

   //your other code
}

适配器应保存特定图像路径/ uri的观察者映射,并具有上载/下载任务调用的方法。还添加了添加和删除观察者的方法:

public class SelectedAdapter_Test extends BaseAdapter {
  private Map<String, ProgressListener> mProgressListener = new HashMap<>();

 //your other code

 synchronized void addProgressObserver(String imagePath, ProgressListener listener) {
    this.mListener.put(imagePath, listener);
 }

 synchronized void removeProgressObserver(String imagePath) {
   this.mListener.remove(imagePath);
 }

 synchronized void updateProgress(String imagePath, int progress) {
   ProgressListener l = this.mListener.get(imagePath);
   if (l != null) {
     l.onProgressUpdate(imagePath, progress);
   }
 }

 //other code
}

在适配器的getView中,将视图持有者注册为观察者:

public View getView(final int i, View convertView, ViewGroup viewGroup) {
  //other code

  holder.imagePath = data.get(i).getSdcardPath();

  this.addProgressObserver(holder.imagePath, holder);

  return convertView;
}

现在的问题是,我们注册了观察者,但没有取消注册。所以让适配器实现View.addOnAttachStateChangeListener:

public class SelectedAdapter_Test extends BaseAdapter implements View.addOnAttachStateChangeListener {
  //other code
  void onViewAttachedToWindow(View v) {
    //We ignore this
  }

  void onViewDetachedFromWindow(View v) {
    //View is not visible anymore unregister observer
    ViewHolder holder = (ViewHolder) v.getTag();
    this.removeProgressObserver(holder.imagePath);
  }

  //other code
}

返回视图时注册该观察者。

public View getView(final int i, View convertView, ViewGroup viewGroup) {
  //other code

  convertView.addOnAttachStateChangeListener(this);

  return convertView;
}

最后,您可以告诉观点进展情况:

@Override
public void transferred(long num) {
   int progress = (int) ((num / (float) totalSize) * 100);
   selectedAdapter.onProgressUpdate(listOfPhotos.get(i).getSdcardPath(), progress);
}

最后一个问题仍然存在,如果在上传过程中活动消失了怎么办?您需要检查活动是否仍然存在。也许在onCreate中将适配器中的标志设置为true,而在onDestroy中将其设置为false就可以了。然后最后一个代码片段可以检查该标志,并且不再通知适配器更改。

那基本上就是如何解决这个问题的想法。它有用吗?我不知道我是在没有任何测试的情况下从头开始编写的。即使它确实如此,当进度为0或100时,你仍然必须管理状态。但我把它留给你。此外,您可能希望更改RecyclerView的BaseAdapter,以便我们可以摆脱View.addOnAttachStateChangeListener。

答案 1 :(得分:0)

  
      
  • 在适配器类中添加布尔值
  •   
    public SelectedAdapter_Test(Context c, ArrayList<CustomGallery> data, boolean showProgress) {
         mContext = c;
         inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         this.data = data;
         this.showProgress = showProgress;
    }
  
      
  • Adapter类getView中的更改
  •   
        holder.pb = (ProgressBar) convertView.findViewById(R.id.progressbar);
        if (showProgress)
            holder.pb.setVisibility(View.VISIBLE);
        else
            holder.pb.setVisibility(View.GONE);
  
      
  • doFileUpload
  • 中进行更改   
private void doFileUpload(View v) {
View vi = v;
for (i = 0; i < listOfPhotos.size(); i++) {
          <--your task-->           
     }
 //**important**
 SelectedAdapter_Test mTest = new SelectedAdapter_Test(context,data,false);
 // set above adapter object respectively;
  mList.setadapter(mTest);
}
  

FYI。设置适配器时第一次将showProgress值传递为true。