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

Posted

技术标签:

【中文标题】在android中显示图像使用位图的延迟【英文标题】:Delay in showing image use bitmap in android 【发布时间】:2013-03-21 01:13:11 【问题描述】:

我从我的设备接收到连续的 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 循环中休眠以逐帧显示 【参考方案1】:

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

您可以做些什么来改进您的程序:

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

【讨论】:

以上是关于在android中显示图像使用位图的延迟的主要内容,如果未能解决你的问题,请参考以下文章

Android:使用位图使用android studio显示图像时出错

Android显示图像位图错误

将图像位图添加到简单适配器 Android

如何在android中使用imageloader释放位图内存?

如何在 Android 中使位图加载更快?

如何在 Android 的 ListView 中延迟加载图像