ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

延迟在android中显示图像使用位图

2019-07-09 06:32:14  阅读:171  来源: 互联网

标签:android image bitmap android-drawable udpclient


我从设备收到连续的UDP数据(RAW图像).解码它并使用位图显示

我的Android手机,所以它看起来像一个视频.问题是框​​架没有显示

不断.框架变化约.每2~3秒,但我想在1/30逐帧显示.

以下是我的代码的一部分

  public class ArDroneMain extends Activity {
  Bitmap  image = null;
  public ImageView myImageView;
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    animationDrawable = new AnimationDrawable(); 
    myImageView = (ImageView)findViewById(R.id.imageView);
    thread.start();   
  }
}

 Thread thread=new Thread  (new Runnable() {
        Message message;
    String obj="run";      
    @Override
    public void run() {   

    while(true){     
        try { 
            Log.e("enter_video_thread","enter_video_thread");
            receiveVideoRawData();
            Log.e("///receiveVideoRawData ","receiveVideoRawData");
            message = handler.obtainMessage(1,obj);
                    handler.sendMessage(message);
        } catch (IOException e) {
            e.printStackTrace();
        }   
    }
   }
  public Handler handler = new Handler(){   


    @SuppressLint("NewApi")
    @Override
    public void handleMessage(Message msg) {
          super.handleMessage(msg);         
            String MsgString = (String)msg.obj;
            if (MsgString.equals("run"))
            {                                                                                
                          Drawable ardrone_Frame_Drawable =newBitmapDrawable(getResources(),image);
                         animationDrawable.addFrame(ardrone_Frame_Drawable,100);
                         myImageView.setBackground(animationDrawable);                       



            }


    }
};


  public void sendTriggerCommand() throws IOException{
        byte [] ip_bytes = new byte[] {(byte)192,(byte)168,(byte)1,(byte)1};//Drone address  
        byte[] buf_snd = {0x01, 0x00, 0x00, 0x00};//trigger buffer
        inet_addr = InetAddress.getByAddress(ip_bytes );
        DatagramPacket packet_snd = new DatagramPacket(buf_snd, buf_snd.length, i   net_addr, ardrone_video_port);       
        socket_video.send(packet_snd);

}

   public void receiveVideoRawData() throws IOException{
    Log.e("enter_receiveVideoRawData()","enter_receiveVideoRawData()");
    socket_video = new DatagramSocket();
    byte[] buf_rcv = new byte[153600];
    DatagramPacket rawData = new DatagramPacket(buf_rcv, buf_rcv.length);
        sendTriggerCommand();
        Log.e("sendTriggerCommand();","sendTriggerCommand();");
        socket_video.receive(rawData);
        Log.e("socket_video.receive(rawData);","socket_video.receive(rawData);");
        ReadRawFileImage readMyRawData=new ReadRawFileImage();

        image = readMyRawData.readUINT_RGBImage(buf_rcv);

}

解决方法:

我真的怀疑你能否快速接收数据,尤其是原始图像.

你可以做些什么来改善你的计划可能是:

>发送和接收压缩数据
>删除while true循环,它永远不会动手.您应该使用布尔标志来控制您的线程.
>使用AsyncTask接收数据,在后台解码,然后在ui线程中显示
>使用2个线程与线程同步:一个从网络读取数据,另一个消耗此数据并显示它.这将是一个更好的架构,可以管理2个任务.

标签:android,image,bitmap,android-drawable,udpclient
来源: https://codeday.me/bug/20190709/1410555.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有