2012-04-12 28 views
17

我用this,以顯示從因特網上的圖像,但它會引發錯誤如下:
04-12 13:45:05.337:E/AndroidRuntime(27897):機器人:致.view.ViewRootImpl $ CalledFromWrongThreadException:只有創建視圖層次結構的原始線程可以觸及其視圖。

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

請參閱「線程處理」 http://www.techotopia.com /index.php/A_Basic_Overview_of_Android_Threads_and_Thread_handlers – samosaris 2013-05-08 16:08:54

+0

在Mono中,使用RunOnUiThread ... RunOnUiThread(()=> {_tvMessage.Text =「Loading ...」;}); http://mono-for-android.1047100.n5.nabble.com/Can-t-create-handler-inside-thread-sync-problem-why-td5710999.html – samosaris 2013-05-08 17:19:22

回答

16

把這個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();  
    } 

和你AsyncTask類應該是這樣的,

 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在onPostExecute拋出錯誤。 imageView無法解析 – 2012-04-12 07:22:40

+0

將ImageView全局聲明爲Activity – 2012-04-12 07:34:58

+0

我認爲你應該使用Thread Handler回調函數,後臺線程調用主UI線程的消息來更新UI(http://www.techotopia。 com/index.php/A_Basic_Overview_of_Android_Threads_and_Thread_handlers) – samosaris 2013-05-08 16:06:53

2

我覺得這行導致錯誤..

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

和錯誤解釋了爲什麼是這樣..

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

這個錯誤造成,因爲你正試圖在mainthread用戶界面從其他線程改變..這裏doInBackground你的情況...

+0

我該如何解決這個..? – 2012-04-12 07:25:14

+0

由於Lalit Poptani告訴...他的代碼解決了,併爲imageView無法解決..聲明ImageView imageView;像這樣oncreate ..以便它可用於所有功能..在活動類.. – 5hssba 2012-04-12 07:27:43

24

我得到了同樣的問題,嘗試使用JNI從C++更改UI視圖。解決的辦法是使用

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

runOnUiThread是一種活動的方法,所以我必須讓我的活動實例公共靜態能夠對我的公共靜態方法誰後來從JNI調用調用。

希望這有助於人:)

PS:在這裏我學會了如何使用JNI http://www.cocos2d-x.org/projects/cocos2d-x/wiki/How_to_use_jni我以前用cocos2dx製成的Android遊戲

+0

另外:要傳遞變量使他們最終,請參閱http://stackoverflow.com/a/7762412/956397 – PiTheNumber 2016-05-30 09:45:36

相關問題