2016-08-08 9 views
1

Пытаясь разработать приложение для картона Google, я загрузил образец из официального sdk. Во внутреннем классе ImageLoaderTask (который он должен быть классом помощника для управления резьбом)Картонный образец, метод должен быть вызван из потока пользовательского интерфейса

class ImageLoaderTask extends AsyncTask<Pair<Uri, Options>, Void, Boolean> { 

    /** 
    * Reads the bitmap from disk in the background and waits until it's loaded by pano widget. 
    */ 
    @Override 
    protected Boolean doInBackground(Pair<Uri, Options>... fileInformation) { 
     Options panoOptions = null; // It's safe to use null VrPanoramaView.Options. 
     InputStream istr = null; 
     if (fileInformation == null || fileInformation.length < 1 
      || fileInformation[0] == null || fileInformation[0].first == null) { 
     AssetManager assetManager = getAssets(); 
     try { 
      istr = assetManager.open("andes.jpg"); 
      panoOptions = new Options(); 
      panoOptions.inputType = Options.TYPE_STEREO_OVER_UNDER; 
     } catch (IOException e) { 
      Log.e(TAG, "Could not decode default bitmap: " + e); 
      return false; 
     } 
     } else { 
     try { 
      istr = new FileInputStream(new File(fileInformation[0].first.getPath())); 
      panoOptions = fileInformation[0].second; 
     } catch (IOException e) { 
      Log.e(TAG, "Could not load file: " + e); 
      return false; 
     } 
     } 

     panoWidgetView.loadImageFromBitmap(BitmapFactory.decodeStream(istr), panoOptions); 
     try { 
     istr.close(); 
     } catch (IOException e) { 
     Log.e(TAG, "Could not close input stream: " + e); 
     } 

     return true; 
    } 
    } 

panoWidgetView является виджетом для панорамы, и он объявлен в деятельности, которая включает в себя этот внутренний класс. Но Android Studio дает мне эту ошибку: Метод loadImageFromBitmap должен вызываться из потока пользовательского интерфейса, в настоящее время выбранный поток является рабочим. Любое возможное решение?

ответ

2

попробуйте подвигать "loadImageFromBitmap" внутри onPostExecute:

class ImageLoaderTask extends AsyncTask<Pair<Uri, BitmapFactory.Options>, Void, Boolean> { 
     Options panoOptions = null; // It's safe to use null VrPanoramaView.Options. 
     InputStream istr = null; 

     /** 
     * Reads the bitmap from disk in the background and waits until it's loaded by pano widget. 
     */ 
     @Override 
     protected Boolean doInBackground(Pair<Uri, BitmapFactory.Options>... fileInformation) { 

      if (fileInformation == null || fileInformation.length < 1 
        || fileInformation[0] == null || fileInformation[0].first == null) { 
       AssetManager assetManager = getAssets(); 
       try { 
        istr = assetManager.open("andes.jpg"); 
        panoOptions = new Options(); 
        panoOptions.inputType = Options.TYPE_STEREO_OVER_UNDER; 
       } catch (IOException e) { 
        Log.e(TAG, "Could not decode default bitmap: " + e); 
        return false; 
       } 
      } else { 
       try { 
        istr = new FileInputStream(new File(fileInformation[0].first.getPath())); 
        panoOptions = fileInformation[0].second; 
       } catch (IOException e) { 
        Log.e(TAG, "Could not load file: " + e); 
        return false; 
       } 
      } 

      try { 
       istr.close(); 
      } catch (IOException e) { 
       Log.e(TAG, "Could not close input stream: " + e); 
      } 

      return true; 
     } 

     @Override 
     protected void onPostExecute(Boolean aBoolean) { 
      if(istr!=null && panoOptions!=null){ 
       panoWidgetView.loadImageFromBitmap(BitmapFactory.decodeStream(istr), panoOptions); 
      } 
      super.onPostExecute(aBoolean); 
     } 
    } 
+0

Отлично. Спасибо, я не могу выполнить работу интерфейса в backgroud. – sgrumo

+0

Точно! https://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result) –

0

Да, не назовите loadImageFromBitmap на фоновом потоке. Метод, которым вы его называете, - doInBackground. Если вы передаете растровое изображение в основной поток, используя метод onPostExecute, вы можете сделать это там.

+0

Не могли бы вы опубликовать также возможный код? Не получил последнюю часть! – sgrumo

+0

Хорошо, я неправильно прочитал ваш код в первый раз. Извини за это. Похоже, вы делаете этот вызов в методе onPostExecute. Вы создаете свой AsyncTask в основном потоке? – CaseyB

0

Вы не можете выполнить и операции пользовательского интерфейса на doInBackground.
Вы должны выполнить эту задачу на onPostExecute.


Но все же вы хотите реализовать на doInBackground, то вы можете сделать с этим способом

runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       panoWidgetView.loadImageFromBitmap(BitmapFactory.decodeStream(istr), panoOptions); 
     } 
    }); 
Смежные вопросы

 Смежные вопросы