加载图像时的微调器或进度条,而不是阻止UI

时间:2011-07-29 04:26:46

标签: android

我有一个加载图片的异步任务。 我怎样才能在图库内部显示一个微调器,其中将加载图像以显示正在进行的一些工作?还是进度条? 但我希望能够在不阻塞整个用户界面的情况下做到这一点。

我将如何做到这一点?

5 个答案:

答案 0 :(得分:10)

更常见的模式是将指标放入活动标题栏以显示某些背景工作正在进行中。

为此,您应该请求窗口功能

requestFeature(FEATURE_INDETERMINATE_PROGRESS);

以后再使用

setProgressBarIndeterminateVisibility(true|false)

显示/隐藏进度

答案 1 :(得分:5)

您可以在ImageAdapter的getView()方法中对自定义布局进行充气(请查看官方Google网站http://developer.android.com/resources/tutorials/views/hello-gallery.html上的示例),例如:

public class ImageAdapter extends BaseAdapter {

    private ProgressBar mProgressBar;
    private ImageView mImageView;
    private String[] mUrls = {
        "http://apod.nasa.gov/apod/fap/image/0011/arcadenov9_trace.jpg",
        "http://apod.nasa.gov/apod/fap/image/0011/earthlights_dmsp_big.jpx",
        "http://apod.nasa.gov/apod/fap/image/0011/earthlights2_dmsp_big.jpx"
    }
    private boolean[] flags = new boolean[3]; // 3 images example
    private LayoutInflater mInflater;

    public ImageAdapter(Context c) {
        mInflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        return 3;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = mInflater.inflate(R.layout.gallery_item, null);
        if (!flags[position]) {
            image = convertView.findViewById(R.id.idImage);
            progressBar = convertView.findViewById(R.id.idProgressBar);
            new DownloadTask(image, progressBar, mUrls[position]).execute();
            flags[position]=true;
        }
        convertView.setLayoutParams(new Gallery.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        return convertView;
    }

gallery_item.xml看起来像这样:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        android:gravity="center" >

        <ProgressBar
            android:id="@+id/idProgressBar"
            style="?android:attr/progressBarStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />

        <ImageView
            android:id="@+id/idImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />

    </LinearLayout>

getView()方法中,您可以将ProgressBar和ImageView实例传递给DownloadTask(扩展AsyncTask的类),例如

new DownloadTask(image, progressBar, mUrls[position]).execute();

doInBackground()中你应该下载(和/或以某种方式缓存/持久化)图像(URL在mUrls [position]中)和onPostExecute()(在UI线程中运行)你应该: / p>

progressBar.setVisibility(View.GONE); // hide progress
imageView.setImageBitmap(bitmap); // set image

作为展示案例,您只能将一个Activity用于main.xml布局:

    <?xml version="1.0" encoding="utf-8"?>
    <Gallery xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/idGallery"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

答案 2 :(得分:3)

你可以在你的布局XML中放置一个ProgressBar,它可以只包含一个微调器(条形样式Widget.ProgressBar.Large.Invers e或Widget.ProgressBar.Small.Inverse)你可以将它设置为始终旋转通过设置xml属性android:indeterminateOnly="true"

此处有更多信息:http://developer.android.com/reference/android/widget/ProgressBar.html

您可以使用异步任务将图像加载到图库中(或者您正在执行此操作),并且在完成异步任务后,您可以将ProgressBar的可见性设置为View.Gone。

编辑:这是xml的一些代码示例

    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical">
        <Gallery XML here>
        <ProgressBar
          android:id="@+id/progress"
          style="?android:attr/progressBarStyleSmallInverse"
          android:layout_height="wrap_content"
          android:layout_width="wrap_content"
          android:layout_gravity="center"
          android:indeterminateOnly="true" />
   </LinearLayout>

我不太确定你的画廊如何加载你的图像,但基本上你需要一种机制来告诉你图像何时完成加载(通常我说你不需要一个微调器,因为图像看起来似乎几乎立即加载,但也许你正在装载需要大量时间的东西)。当您的图片完成加载后,只需致电setVisibility(View.GONE)。如果你想要一个TextView说加载或者随意把它放在XML中。

答案 3 :(得分:1)

试试这段代码

private void showProgrssBar(){
pLayout.setVisibility(View.VISIBLE);
final StringBuffer s=new StringBuffer();
final Thread progressThread=new Thread(){
    @Override
    public void run(){


            while(CreateVideoService.processingFrame>1) {
                 inc=100-((CreateVideoService.processingFrame*100)/(CreateVideoService.numberofRecordedFrames));
                 if(s.length()>0)
                 s.delete(0, s.length());
                 s.append("Processing... ").append(inc).append("%");
                 progressBarHandler.post(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        progressBar.setProgress(inc);
                        textProgrs.setText(s); 
                    }
                });
                 //progressBar.setProgress(100-inc);
                 try {
                     // Sleep for 5 seconds
                     Thread.sleep(200);
                 } catch (InterruptedException e) {
                     //Log.d("TAG", "sleep failure");
                 }
            }
            layoutHandler.post(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    pLayout.setVisibility(View.GONE);
                }
            });

    }
};
progressThread.start();

}

答案 4 :(得分:0)

在AsyncTask的onPreExecute方法中使用ProgressDialog

    private String message;    
    private ProgressDialog dialog1 = new ProgressDialog(YourActivityClass.this);

         protected void onPreExecute()
         {

            message="Loading images.\n Please wait...";
             dialog1 = ProgressDialog.show(YourActivityClass.this, "", 
                     message, true);

         }

取消onPostExecute()方法中的对话框