2012-04-12 17 views
17

I był przy this do wyświetlania obrazu z Internetem, a zgłasza błąd, jak poniżej:
12/04 13: 45: 05.337: E/Android Runtime (27897) spowodowane przez: Android .view.ViewRootImpl $ CalledFromWrongThreadException: Tylko oryginalny wątek, który utworzył hierarchię widoku, może dotykać jej widoków.

public class Order extends Activity { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      new DownloadFilesTask().execute();  
     }  
     private class DownloadFilesTask extends AsyncTask<Void, Void, Void> { 
      protected void onPostExecute(Void result) { 
      } 
      @Override 
      protected Void doInBackground(Void... params) { 
       setContentView(R.layout.order); 
        ImageView imageView = (ImageView)findViewById(R.id.imgView); 
        imageView.setImageDrawable(createDrawableFromURL("http://savagelook.com/misc/sl_drop2.png")); 
        return null; 
      }   
     }  
     private Drawable createDrawableFromURL(String urlString) { 
      Drawable image = null; 
     try { 
      URL url = new URL(urlString); 
      InputStream is = (InputStream)url.getContent(); 
      image = Drawable.createFromStream(is, "src"); 
     } catch (MalformedURLException e) { 
      image = null; 
     } catch (IOException e) { 
      image = null; 
     } 
     return image; 
     } 

} 
+0

Patrz „Manipulatory nici” http://www.techotopia.com /index.php/A_Basic_Overview_of_Android_Threads_and_Thread_handlers – samosaris

+0

W Mono użyj RunOnUiThread ... RunOnUiThread (() => {_tvMessage.Text = "Ładowanie ...";}); http://mono-for-android.1047100.n5.nabble.com/Can-t-create-handler-inside-thread-sync-problem-why-td5710999.html – samosaris

Odpowiedz

16

umieścić to w onCreate()

ImageView imageView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.order); 
     imageView = (ImageView)findViewById(R.id.imgView); 
     new DownloadFilesTask().execute();  
    } 

I klasa AsyncTask powinno być tak,

 private class DownloadFilesTask extends AsyncTask<Void, Void, Void> { 
      Drawable drawable; 

      @Override 
      protected Void doInBackground(Void... params) { 
      drawable = createDrawableFromURL(
            "http://savagelook.com/misc/sl_drop2.png"); 
       return null; 
      } 
      protected void onPostExecute(Void result) { 
        imageView.setImageDrawable(drawable); 
      }   
     } 
+0

imageView w onPostExecute throw error. imageView nie może być rozwiązany –

+0

Oświadczam, że ImageView jest globalnym działaniem –

+0

Wydaje mi się, że Twój użytkownik powinien używać wywołania zwrotnego Thread-Handler, którego wątek tła wywołuje z komunikatem dla głównego wątku UI, aby zaktualizować interfejs użytkownika (http: //www.techotopia. com/index.php/A_Basic_Overview_of_Android_Threads_and_Thread_handlers) – samosaris

2

Myślę, że ta linia jest przyczyną błędu ..

imageView.setImageDrawable(createDrawableFromURL("http://savagelook.com/misc/sl_drop2.png")); 

a błąd wyjaśnia, dlaczego tak jest ..

 Only the original thread that created a view hierarchy can touch its views. 

ten błąd jest spowodowany ponieważ próbujesz zmienić interfejsu użytkownika na mainthread z innego wątku .. tutaj doInBackground w twoim przypadku ...

+0

jak rozwiązać ten problem? –

+0

jak Lalit Poptani powiedział ... jego kod rozwiązuje ... i dla imageView nie można rozwiązać .. zadeklaruj ImageView imageView; tak jak przed uruchomieniem .. tak, aby był dostępny dla wszystkich funkcji .. w klasie aktywności .. – 5hssba

24

Mam ten sam problem, próbując zmienić widok interfejsu użytkownika z C++ przy użyciu JNI. Rozwiązaniem było zastosowanie

runOnUiThread(new Runnable() { 
    public void run(){ 
    } 
}); 

runOnUiThread jest sposób aktywny, więc muszę zrobić moja aktywność wystąpienie publiczne statyczny, aby móc wezwać mojego publicznego metodą statyczną, która później zadzwonić z JNI.

nadzieję, że ta pomoc innym :)

PS: stąd Uczę się, jak używać JNI http://www.cocos2d-x.org/projects/cocos2d-x/wiki/How_to_use_jni dla mojego Android gra uprzednio wykonanej z cocos2dx

+0

Ponadto: przekazywanie zmiennych czyni je ostatecznymi, zobacz http://stackoverflow.com/a/7762412/956397 – PiTheNumber

Powiązane problemy