2015-01-31 3 views
1

Я пытаюсь использовать Ruby-DRb-сообщения с Android с Ruboto. Я столкнулся с проблемой, связанной с сетью из Ruboto, и не нашел примеров или документации для решения этой проблемы.Доступ к сети из Ruboto

Это мой пример (я использовал Ruboto QuickStartActivity и пытался добавить свой материал):

require 'ruboto/widget' 
require 'ruboto/util/toast' 
require 'drb' 

ruboto_import_widgets :Button, :LinearLayout, :TextView 

class QuickStartActivity 
    def onCreate(bundle) 
    super 
    set_title 'My Title' 
    self.content_view = 
     linear_layout :orientation => :vertical do 
      @text_view = text_view :text => 'Test Buttons', :id => 42, 
           :layout => {:width => :match_parent}, 
           :gravity => :center, :text_size => 48.0 
      button :text => 'Press me', 
       :layout => {:width => 300}, 
       :id => 43, :on_click_listener => proc { butterfly } 
     end 
    rescue Exception 
    puts "Exception creating activity: #{$!}" 
    puts $!.backtrace.join("\n") 
    end 

    private 

    def butterfly 
    @text_view.text = 'Button pressed' 
    toast "trying to send a message" 
    DRb.start_service 
    myDRb = DRbObject.new_with_uri("druby://192.168.1.100:9918") 
    myDRb.myMethod('This string should be processed by myMethod') 
    end 
end 

Если я использую два Linux-машину (DRB-сервер и DRB-клиент), DRB-материал работает без проблемы через сеть. Но если я пытаюсь мой код, приведенный выше, LogCat показывает:

D/AndroidRuntime(17415): Shutting down VM 
W/dalvikvm(17415): threadid=1: thread exiting with uncaught exception (group=0x2b4ea1f8) 
E/AndroidRuntime(17415): FATAL EXCEPTION: main 
E/AndroidRuntime(17415): android.os.NetworkOnMainThreadException 
E/AndroidRuntime(17415): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
E/AndroidRuntime(17415): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 

My Android-манифеста включает в себя:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

Согласно другим должностям (How to fix android.os.NetworkOnMainThreadException?) Я прочитал, эта ошибка выбрасывается, потому что это не можно использовать сеть из основного потока в Android.

Но как я могу исправить эту проблему на стороне Ruboto, чтобы заставить DRb работать?

ответ

0

Один из способов сделать это - выполнить сетевой код в потоке, а затем использовать обратный вызов для результата.

def butterfly 
    @text_view.text = 'Button pressed' 
    toast "trying to send a message" 
    Thread.start do 
    DRb.start_service 
    myDRb = DRbObject.new_with_uri("druby://192.168.1.100:9918") 
    result = myDRb.myMethod('This string should be processed by myMethod') 
    process_result(result) 
    end 
end 

def process_result(result) 
    run_on_ui_thread do 
    @text_view.text = 'Result received' 
    toast "Got a result from the method: #{result}" 
    end 
end 

Надеется, что это помогает :)

+0

Спасибо за вашу помощь, она сейчас работает. – Gordon

+0

Рад помочь. Не стесняйтесь отмечать ответ как принятый и не забудьте сообщить о своем прогрессе в списке рассылки Ruboto. Мы любим слышать от новых разработчиков (http://groups.google.com/group/ruboto). – donV

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

  • Нет связанных вопросов^_^