ProgressBar未在Fragment中更新

时间:2014-09-17 02:09:33

标签: android android-fragments synchronized android-progressbar

我的应用程序中有一个代表静态值的ProgressBar,该值来自服务器。

我在Fragment中的代码在onCreateView中,如下:

public class AgeFragment extends Fragment {

List<TableStatsCache> tableStatsCacheList;
String place,partial1,partial2, partial3, partial4, partial5, partial6;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    TextView placeTextView;
    TextView partial1TextView, partial2TextView, partial3TextView, partial4TextView, partial5TextView, partial6TextView;
    ProgressBar bar1ProgressBar, bar2ProgressBar, bar3ProgressBar, bar4ProgressBar, bar5ProgressBar, bar6ProgressBar;


    readTableStatsCache();

    View rootView = inflater.inflate(R.layout.fragment_age, container, false);



    placeTextView = (TextView) rootView.findViewById(R.id.placeTextView);

    partial1TextView = (TextView) rootView.findViewById(R.id.partial1TextView);
    partial2TextView = (TextView) rootView.findViewById(R.id.partial2TextView);
    partial3TextView = (TextView) rootView.findViewById(R.id.partial3TextView);
    partial4TextView = (TextView) rootView.findViewById(R.id.partial4TextView);
    partial5TextView = (TextView) rootView.findViewById(R.id.partial5TextView);
    partial6TextView = (TextView) rootView.findViewById(R.id.partial6TextView);
    bar1ProgressBar = (ProgressBar) rootView.findViewById(R.id.bar1ProgressBar);
    bar2ProgressBar = (ProgressBar) rootView.findViewById(R.id.bar2ProgressBar);
    bar3ProgressBar = (ProgressBar) rootView.findViewById(R.id.bar3ProgressBar);
    bar4ProgressBar = (ProgressBar) rootView.findViewById(R.id.bar4ProgressBar);
    bar5ProgressBar = (ProgressBar) rootView.findViewById(R.id.bar5ProgressBar);
    bar6ProgressBar = (ProgressBar) rootView.findViewById(R.id.bar6ProgressBar);


    placeTextView.setText(place);
    partial1TextView.setText(partial1+"%");
    partial2TextView.setText(partial2+"%");
    partial3TextView.setText(partial3+"%");
    partial4TextView.setText(partial4+"%");
    partial5TextView.setText(partial5+"%");
    partial6TextView.setText(partial6+"%");

    bar1ProgressBar.setProgress(Math.round(Float.valueOf(partial1)));   
    bar2ProgressBar.setProgress(Math.round(Float.valueOf(partial2)));
    bar3ProgressBar.setProgress(Math.round(Float.valueOf(partial3)));
    bar4ProgressBar.setProgress(Math.round(Float.valueOf(partial4)));
    bar5ProgressBar.setProgress(Math.round(Float.valueOf(partial5)));
    bar6ProgressBar.setProgress(Math.round(Float.valueOf(partial6)));



    return rootView;
}



public void readTableStatsCache(){

    DatabaseHandlerTableStatsCache db_read = new DatabaseHandlerTableStatsCache(CallFragment.context);

    tableStatsCacheList = db_read.getAllLines();       

    for (TableStatsCache cn : tableStatsCacheList) {

        place = cn.getPlace();
        partial1 = cn.getPartial1();
        partial2 = cn.getPartial2();
        partial3 = cn.getPartial3();
        partial4 = cn.getPartial4();
        partial5 = cn.getPartial5();
        partial6 = cn.getPartial6();

    }
    }
}

此片段在创建时显示ProgressBar正确,但是当我的FragmentActivity重新加载Fragment时,ProgressBar不会更新。 只更新TextView。

为了重新加载一个片段,我在FragmentActivity中有这个:

    viewPager.removeAllViews();     
    viewPager.setAdapter(mAdapter);

我认为问题可能是因为“setProgress”方法是同步的。

我如何将旧线程发布到新线程可以运行该方法?

2 个答案:

答案 0 :(得分:0)

我不知道你是如何从服务器获得价值的,但我认为问题在于你的静态价值。它没有刷新,并且酒吧的进展没有改变。你如何从服务器上检索价值?

答案 1 :(得分:0)

我知道我很难回答这个问题。可能你已经解决了这个问题,但它可能对将来遇到类似问题的人有所帮助。我也面临着类似的问题。就我而言,progressbar.setProgress(someStaticValue);无法在viewPager中的片段内工作。当viewPager显示最后一页时,我添加了新的片段。数据来自服务器,在进行一些计算后,我需要显示进度状态。我的片段包含4个progressBar和一些textViews,所有这些都应该用 someStaticValue 更新。进度条第一次成功更新,但添加一个MoreFragment后,它无法更新进度条的进度状态,尽管TextViews正在更新。我做了很多研究,但找不到合适的解决方案。然后我看到了你的帖子,你提示问题可能是由于setProgress()同步性质。所以我试图在一个新线程中调用setProgress()但是值应该在mainThread上更新。为此,我使用了Handler。以下是我更新进度条的方法。

new Handler().post(new Runnable() {
            @Override
            public void run() {
                mScienceProgressBar.setProgress(scienceScore);
            }
        }); 

此处更新操作将在不同的主题上执行,但更新将反映在 mainThread。