2012-04-12 13 views
17

usavo this, per visualizzare le immagini da Internet, ma genera un errore come di seguito:
04-12 13: 45: 05,337: E/AndroidRuntime (27897): causati da: Android .view.ViewRootImpl $ CalledFromWrongThreadException: solo il thread originale che ha creato una gerarchia di viste può toccare le sue viste.

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

Vedere "Handlers discussione" http://www.techotopia.com /index.php/A_Basic_Overview_of_Android_Threads_and_Thread_handlers – samosaris

+0

In Mono, usa RunOnUiThread ... RunOnUiThread (() => {_tvMessage.Text = "Caricamento in corso ...";}); http://mono-for-android.1047100.n5.nabble.com/Can-t-create-handler-inside-thread-sync-problem-why-td5710999.html – samosaris

risposta

16

Mettere questo in 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();  
    } 

E la classe AsyncTask dovrebbe essere così,

 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 in onPostExecute errore di lancio. imageView non può essere risolto –

+0

dichiarare ImageView come globale per Attività –

+0

Penso che si supponga che si stia utilizzando una richiamata Thread Handler che il thread in background chiama con un messaggio per il thread principale dell'interfaccia utente per aggiornare l'interfaccia utente con (http: //www.techotopia. com/index.php/A_Basic_Overview_of_Android_Threads_and_Thread_handlers) – samosaris

2

penso che questa linea sta causando l'errore ..

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

e l'errore spiega perché è così ..

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

questo errore è causato perché si sta tentando di modificare l'interfaccia utente su mainthread da qualche altro thread .. ecco doInBackground nel tuo caso ...

+0

come posso risolvere questo ..? –

+0

come ha detto Lalit Poptani ... il suo codice risolve .. e per imageView non può essere risolto .. dichiarare ImageView imageView; in questo modo prima di oncreate .. in modo che sia disponibile per tutte le funzioni ... nella classe di attività .. – 5hssba

24

Ho avuto lo stesso problema cercando di cambiare la vista dell'interfaccia utente da C++ utilizzando JNI. La soluzione è stata utilizzo

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

runOnUiThread è un metodo di attività quindi devo fare la mia attività di un'istanza statica pubblico di essere in grado di chiamare il mio metodo statico pubblico che in seguito chiamata da JNI.

Sperare questo aiuto gli altri :)

PS: da qui imparo come utilizzare JNI http://www.cocos2d-x.org/projects/cocos2d-x/wiki/How_to_use_jni per il mio gioco Android in precedenza tramite cocos2dx

+0

Inoltre: per passare le variabili renderle definitive, vedere http://stackoverflow.com/a/7762412/956397 – PiTheNumber

Problemi correlati