改装冻结Ui

时间:2018-10-23 15:22:35

标签: android android-asynctask retrofit freeze

我正在使用AsyncTask将我的位图转换为base64字符串。 之后,在asyncTask的后执行中,我尝试使用改型将该base64字符串上载到服务器中。

但是当我提出改造请求时,我的应用程序就会冻结。

这是我的代码:

  public class ConvertBitmapToString extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {
        String base64String = FrequentFunctions.convertBitmapToBase64(singleBitmapDetail.getBitMap());
        return base64String;
    }


    @Override
    protected void onPostExecute(final String result) {
        hideProgressBar();
        hitInsertImageApi(result);
    }

    @Override
    protected void onPreExecute() {
        baseShowProgressBar();
    }
}

这是我的改装请求代码:

 Call<InsertImageResponse> callback = api.insertUpdateImage(userId, imageid, imageData);
    callback.enqueue(new Callback<InsertImageResponse>() {
        @Override
        public void onResponse(Call<InsertImageResponse> call, Response<InsertImageResponse> response) {
            if (response.body().getReturnMessage().equalsIgnoreCase("success")) {
                handler.onSuccess(response.body());
            } else {
                handler.onError("Something went wrong");
            }
        }

        @Override
        public void onFailure(Call<InsertImageResponse> call, Throwable t) {
            handler.onError(t.getMessage());
        }
    });

请帮帮我

4 个答案:

答案 0 :(得分:0)

您仍在后执行中调用改造...当您与ui元素进行交互时,此操作位于主线程上。通过调用Retrofit,它将阻塞线程,直到发送base64字符串为止。

答案 1 :(得分:0)

默认情况下,Retrofit在后台运行,并使用回调将结果发送到主线程。查看事件探查器,然后您可以了解哪一方正在占用设备的更多内存。

答案 2 :(得分:0)

在我的情况下,<ul> <li ng-repeat="x in combinedJson | orderBy:sortprice"> <div class="product flex-container row"> <div>{{x.price}}</div> </div> </li> </ul> someString.equalsIgnoreCase(otherString)为空时停止了剩余的代码执行(无错误);

答案 3 :(得分:-1)

在我的情况下,Retrofit 的创建/初始化是一种阻塞 UI 线程的方法,特别是当您使用像 Moshi 这样的适配器时。其他人也在他们的存储库中报告了这个 problem