【问题标题】:Android how to do setProgressBarIndeterminateVisibility(false) from another class?Android 如何从另一个类做 setProgressBarIndeterminateVisibility(false)?
【发布时间】:2013-02-22 11:17:26
【问题描述】:

我有两个类,一个显示图像,下一个只在背景中加载图像,但问题是 第二类需要从 第一类setProgressBarIndeterminateVisibility(false) em>,我不知道该怎么做。

我的第一堂课:

public class Galeria extends Activity {

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

    setContentView(R.layout.activity_galeria);

    setProgressBarIndeterminateVisibility(true); 
    ...
}

我的第二堂课:

public class CargarImagenes extends AsyncTask<Object, Bitmap, Object> {

protected Object doInBackground(Object... params) {

other operations...
}

protected void onPostExecute(Object result) {
    Galeria galeria = new Galeria();


    // This is the problem!!
    galeria.setProgressBarIndeterminateVisibility(false);
}

【问题讨论】:

    标签: android android-asynctask android-progressbar


    【解决方案1】:

    来自画廊

    new CargarImagenes().execute(this);
    

    在 CargarImagenes

    public class CargarImagenes extends AsyncTask<Object, Bitmap, Object> {
    
        Context context;
    
        protected Object doInBackground(Object... params) {
            context = (Context) params[0];
        other operations...
        }
    
        protected void onPostExecute(Object result) {
            Galeria galeria = new Galeria();
    
    
            ((Activity)context).setProgressBarIndeterminateVisibility(false)
        }
    
    }   
    

    【讨论】:

    • 这项工作,非常感谢!很抱歉没有投票,我有足够的声誉。
    • 现在你不需要在 onPostExecute 中使用 Galeria galeria = new Galeria()
    【解决方案2】:

    当你把 Galeria galeria = new Galeria();在您的第二堂课中,您正在制作一个新的 Galeria 实例。你需要得到你在第一堂课中创建的Galeria。

    尝试这样做:(将公共更改为私有)并将代码插入到您的第一个类中。

    private class CargarImagenes extends AsyncTask<Object, Bitmap, Object> {
    
    protected Object doInBackground(Object... params) {
    
    other operations...
    }
    
    protected void onPostExecute(Object result) {
        //Galeria galeria = new Galeria();
    
    
    // This is the problem!!
    pb.setProgressBarIndeterminateVisibility(false);
    

    }

    pb 是你的 ProgressBar。

    把它放在第一类,比如 公共进度条 pb;

    然后做类似的事情
    pb=新进度条(这个); ....

    【讨论】:

      【解决方案3】:

      您可以使用总线类或库,例如来自 Square 的 Otto 或来自 Guava 的 Bus。 他们可以在每个注册的课程中相互交流。在他们的网页上阅读更多信息。

      【讨论】:

        【解决方案4】:

        如果您可以使用 Wea​​kReference 从 AsyncTask 引用对象会更好,因为这是防止您访问空对象的可靠方法。

        public class CargarImagenes extends AsyncTask<Void, Bitmap, Object> {
        
            WeakReference<Activity> mActivity;
        
            public CargarImagenes(Activity activity){
        
                 mActivity = new WeakReference<Activity>(activity);
            }
        
            protected Object doInBackground(Void... params) {
        
                other operations...
            }
        
            protected void onPostExecute(Object result) {
        
                Activity activity = mActivity.get();
                if(activity != null){    
                    activity.setProgressBarIndeterminateVisibility(false);
                }
            }    
        }
        

        然后你可以像这样创建 CargarImagenes

        CargarImagenes task = new CargarImagenes(this);
        

        并执行它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-20
          • 1970-01-01
          • 1970-01-01
          • 2014-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多