【问题标题】:how to use call a handler in an activity from another activity or main class如何在另一个活动或主类的活动中使用调用处理程序
【发布时间】:2017-08-09 08:53:05
【问题描述】:

我正在尝试使用输入输出流在 android 上与 USB 通信,因为我在活动中使用处理程序,它工作正常,但如果在每个活动中单独使用处理程序,它就不能正常工作,所以我希望一个共同的活动并在活动中作为所有活动的中介进行交流,我尝试了类似

public class BasicAccessoryDemo extends Activity implements View.OnClickListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button mycontrol, close_command;
        mycontrol = (Button) findViewById(R.id.send_command);
        mycontrol.setOnClickListener(this);
    }

    @Override
    public void onStart() {
        super.onStart();
    }

    @Override
    public void onResume() {
        super.onResume();
    }

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.send_command:
                byte[] commandPacket = new byte[2];
                commandPacket[0] =0x12;
                commandPacket[1] =0x34;
                Usb_Communciation.Send_message(commandPacket);
                break;
        }
    }

}

另一个持有处理程序的类是

public class Usb_Communciation extends Activity{
    public final static int USBAccessoryWhat = 0;
    public int firmwareProtocol = 0;
    public static USBAccessoryManager accessoryManager;
    public static String TAG = "MICROCHIP";
    public static final int APP_CONNECT                 = (int)0xAE;
    public boolean deviceAttached = false;

    public void onCreate(Bundle savedInstanceState) {
        accessoryManager = new USBAccessoryManager(handler, USBAccessoryWhat);
       //accessoryManager.enable(this, getIntent());
    }

    public static void Send_message(byte[] data) {
        try{
            accessoryManager.write(data);
        }catch (Exception e){
            Log.d(TAG,
                    "USBAccessoryManager:write():IOException: arasu "
                            + e.toString());
            e.printStackTrace();
        }
    }

    public Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            byte[] commandPacket = new byte[64];
            byte[] WriteValue = new byte[2];

            switch(msg.what)
            {
                case USBAccessoryWhat:
                    boolean StopReading = true;
                    int count = 0;
                    switch(((USBAccessoryManagerMessage)msg.obj).type)
                    {
                        case READ:
                            if(accessoryManager.isConnected() == false) {
                                return;
                            }
                            while(true) {
                                if (accessoryManager.available() < 2) {
                                    break;
                                }
                            }
                            break;
                        case READY:
                            String version = ((USBAccessoryManagerMessage)msg.obj).accessory.getVersion();
                            firmwareProtocol = getFirmwareProtocol(version);
                            switch(firmwareProtocol){
                                case 1:
                                    deviceAttached = true;
                                    break;
                                case 2:
                                    deviceAttached = true;
                                    commandPacket[0] = (byte) APP_CONNECT;
                                    commandPacket[1] = 0;
                                    accessoryManager.write(commandPacket);                                  
                                    Log.d(TAG,"connect message sent.");
                                    break;
                            }
                            break;
                    }
                    break;
            }   //switch
        } //handleMessage
    }; //handler

    public int getFirmwareProtocol(String version) {
        String major = "0";
        int positionOfDot;
        positionOfDot = version.indexOf('.');
        if(positionOfDot != -1) {
            major = version.substring(0, positionOfDot);
        }
        return new Integer(major).intValue();
    }
}

【问题讨论】:

  • 我认为你应该把它设为单例。为什么它是一个 Activity 有什么原因吗?
  • 没有理由我只是把它作为一个活动来尝试,只是为了添加 oncreate
  • 是的,那么我会使用单例模式。把你所有的逻辑放在那里,你可以从任何地方访问它。这是一个example 如何在 Java 中创建一个
  • 谢谢,我会试试

标签: java android inputstream handler outputstream


【解决方案1】:

您正在使用像普通 java 类一样的活动类,我看到第二个活动没有任何视图文件。您可以使用构造函数创建一个名为 UsbCommunication 的普通类,并在您的活动中初始化它,如下所示:

public class Usb_Communciation {
    public final static int USBAccessoryWhat = 0;
    public int firmwareProtocol = 0;
    public static USBAccessoryManager accessoryManager;
    public static String TAG = "MICROCHIP";
    public static final int APP_CONNECT                 = (int)0xAE;
    public boolean deviceAttached = false;


    public Usb_Communciation (/*Pass neccesary parameters here from activity*/) {
       accessoryManager = new USBAccessoryManager(handler, USBAccessoryWhat);
    }


    public void Send_message(byte[] data) {
       try{
           accessoryManager.write(data);
       }catch (Exception e){
          Log.d(TAG,
                "USBAccessoryManager:write():IOException: arasu "
                        + e.toString());
        e.printStackTrace();
       }
   }

   public Handler handler = new Handler() {
       @Override
       public void handleMessage(Message msg) {
           byte[] commandPacket = new byte[64];
           byte[] WriteValue = new byte[2];

           switch(msg.what)
           {
            case USBAccessoryWhat:
                boolean StopReading = true;
                int count = 0;
                switch(((USBAccessoryManagerMessage)msg.obj).type)
                {
                    case READ:
                        if(accessoryManager.isConnected() == false) {
                            return;
                        }
                        while(true) {
                            if (accessoryManager.available() < 2) {
                                break;
                            }
                        }
                        break;
                    case READY:
                        String version = ((USBAccessoryManagerMessage)msg.obj).accessory.getVersion();
                        firmwareProtocol = getFirmwareProtocol(version);
                        switch(firmwareProtocol){
                            case 1:
                                deviceAttached = true;
                                break;
                            case 2:
                                deviceAttached = true;
                                commandPacket[0] = (byte) APP_CONNECT;
                                commandPacket[1] = 0;
                                accessoryManager.write(commandPacket);                                  
                                Log.d(TAG,"connect message sent.");
                                break;
                        }
                        break;
                }
                break;
        }   //switch
    } //handleMessage
}; //handler

   public int getFirmwareProtocol(String version) {
       String major = "0";
       int positionOfDot;
       positionOfDot = version.indexOf('.');
       if(positionOfDot != -1) {
        major = version.substring(0, positionOfDot);
    }
    return new Integer(major).intValue();
}

并在您的活动中调用该函数:

public void onClick(View view) {
    switch (view.getId()) {
        case R.id.send_command:
            byte[] commandPacket = new byte[2];
            commandPacket[0] =0x12;
            commandPacket[1] =0x34;
            Usb_Communication usbCom = new Usb_Communication();
            usbCom.Send_message(commandPacket);
            break;
    }
}

【讨论】:

  • 当任何新数据通过类中的 Usb_Communication 处理程序时,如何在不使用单击的情况下从活动处理程序获取数据。换句话说,我想在处理程序获取新消息时从 Usb_communication 接收数据。现在它在点击事件发生时接收。
【解决方案2】:

在这种情况下,我们使用IntentService。在哪里定义一个 IntentService,它是一个在接收到操作时将在后台工作的类。然后您可以处理您的输入输出流(在后台!!这是我们想要的),然后使用 BroadcastReceiver 向您的活动发送广播。

【讨论】:

    【解决方案3】:

    您可以在应用程序类中创建一个处理程序。

    public class YourApp extends Application {
    
        private Handler handler;
    
        @Override
        public void onCreate() {
            super.onCreate();
            handler = new Handler(Looper.getMainLooper());
        }
    
        public Handler getHandler() {
            return handler;
        }
    }
    

    然后你可以从其他组件中获取处理程序,例如从Activity:

    ((YourApp)getApplication()).getHandler();
    

    不要忘记在 Manifest 文件中设置应用程序名称。

    <application
        android:name=".YourApp"
    ....>
    

    【讨论】:

      猜你喜欢
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多