【问题标题】:textview and progress bar not updating while syncing mysql to sqlite将mysql同步到sqlite时textview和进度条不更新
【发布时间】:2020-11-19 09:44:52
【问题描述】:

当我尝试使用retrofit2库通过rest api将数据从mysql同步到sqlite时,我无法更新同步状态的实时百分比

ProgressBar progressBar;
Retrofit retrofit;
Baseurl bs;
List<Voterdata> voterslist;
TextView downloadstatus;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    bs=new Baseurl();
    retrofit =new Retrofit.Builder()
            .baseUrl(bs.getBaseUrl())
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    downloadstatus=findViewById(R.id.tvdownloadstatus);
    progressBar=findViewById(R.id.progressbarvotersdata);
}

改造代码分为onresponse和offline sync两部分

public void syncvoterdata(View V){
    downloadstatus.setText("Fetching from server");//is being displayed
    Api_voterdata api=retrofit.create(Api_voterdata.class);
    Call<List<Voterdata>> call=api.voterdata();
    call.enqueue(new Callback<List<Voterdata>>() {
        @Override
        public void onResponse(Call<List<Voterdata>> call, Response<List<Voterdata>> response) {
            voterslist=new ArrayList<>(response.body());
            downloadstatus.setText("fetch completed starting sync with local storage total records:-"+voterslist.size());
            //no change in display
            synctake(voterslist);
        }

        @Override
        public void onFailure(Call<List<Voterdata>> call, Throwable t) {
        }
    });
}

同步到 sqlite 在这里

public void synctake(List<Voterdata> data){
int totalrecords=data.size();
Log.d("no of rows", String.valueOf(data.size()));// working in logcat
internaldatabase db=new internaldatabase(MainActivity.this);
//both components are not getting updated here
downloadstatus.setText("saved "+0+" of "+totalrecords);
progressBar.setMax(totalrecords);
progressBar.setProgress(0);
progressBar.animate();
for(int i=0;i<data.size();i++){
    db.Syncdata(data.get(i));
    downloadstatus.setText("saved "+i+" of "+totalrecords);
    Log.d("status","saved "+i+" of "+totalrecords);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        progressBar.setProgress(i,true);
    }
}
db.close();

}

只有在 sqlite 同步任务完成后,textview 和进度条都显示为 100,中间没有变化

【问题讨论】:

    标签: android textview retrofit android-livedata android-progressbar


    【解决方案1】:

    这是因为您在主 ui 线程上进行计算。这意味着您的 UI 在加载完成之前会被阻止,并且只会在之后更新。

    您可以通过 ValueAnimator 设置动画的 ProgressBar

    对文本产生这样的效果有点棘手,但可以使用ObjectAnimator

    【讨论】:

      【解决方案2】:

      它实际上是在一个改造 2 中,所以它在后台线程上运行,runmainuithread 解决了这个问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多