Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 后台线程中的位图操作使UI无响应_Android_Performance_Android Layout_Android Studio_Android Progressbar - Fatal编程技术网

Android 后台线程中的位图操作使UI无响应

Android 后台线程中的位图操作使UI无响应,android,performance,android-layout,android-studio,android-progressbar,Android,Performance,Android Layout,Android Studio,Android Progressbar,我正在后台线程中运行以下操作: 以jpeg格式本地存储字节图像数据 获取该图像作为位图 运行人脸检测算法并提取人脸点 根据这些点放置覆盖 最后再次保存位图 在执行这些操作时,我会显示一个进度条。但是进度条动画被卡住了,也就是说,在线程完成其工作之前,它将变得没有响应(更新:在后台工作运行时,整个UI中似乎没有任何功能) 这难道不会使使用后台线程的实际意图过时吗 我应该采取什么方法来克服这个问题 我的代码是: //Show ProgressBar Runnable worker = ()

我正在后台线程中运行以下操作:

  • 以jpeg格式本地存储字节图像数据
  • 获取该图像作为位图
  • 运行人脸检测算法并提取人脸点
  • 根据这些点放置覆盖
  • 最后再次保存位图
  • 在执行这些操作时,我会显示一个进度条。但是进度条动画被卡住了,也就是说,在线程完成其工作之前,它将变得没有响应(更新:在后台工作运行时,整个UI中似乎没有任何功能)

    这难道不会使使用后台线程的实际意图过时吗

    我应该采取什么方法来克服这个问题

    我的代码是:

      //Show ProgressBar
      Runnable worker = () -> {
    
          //My Operations
    
         runOnUiThread(() -> {
    
                 //Hide ProgressBar
    
              });
        }
    

    您可以使用异步方法,它将起作用

     private class MyAsyncTask extends AsyncTask<String, Progress, Bitmap> {
     protected void onPreExecute() {
         // Runs on the UI thread before doInBackground
    
         progressBar.setVisibility(ProgressBar.VISIBLE);
     }
    
     protected Bitmap doInBackground(String... strings) {
         // Some long-running task like downloading an image.
         // convert your bitmap
         return someBitmap;
     }
    
     protected void onProgressUpdate(Progress... values) {
      //update progress
     }  
    
     protected void onPostExecute(Bitmap result) {
         //hide progress bar
     }}
    
    私有类MyAsyncTask扩展了AsyncTask{
    受保护的void onPreExecute(){
    //在doInBackground之前在UI线程上运行
    progressBar.setVisibility(progressBar.VISIBLE);
    }
    受保护位图doInBackground(字符串…字符串){
    //一些长期运行的任务,如下载图像。
    //转换位图
    返回位图;
    }
    受保护的void onProgressUpdate(进度…值){
    //更新进度
    }  
    受保护的void onPostExecute(位图结果){
    //隐藏进度条
    }}
    
    你能把你的代码使用RxJava发布到后台进程中吗。@Jaymin在所有RxJava都使用线程之后,这会有什么不同?你从哪里开始进度条?你能保证你没有在主UI线程中运行后台线程吗?我之前就在做这件事。但我发现asyncTask比普通线程要慢。因为对于常规线程,引擎盖下的线程优先级大于异步任务