2012-07-09 35 views
5

Tôi đang viết ứng dụng này, nơi tôi nhận được hình ảnh trực tiếp từ một kết nối TCP và tôi cần hiển thị chúng trên ImageViev.Làm thế nào để gọi một asynctask bên trong một sự kiện bấm nút

Điều tôi đang làm là gọi asynctask bên trong nút bấm. nhưng nó dường như tạo ra một số chủ đề nền.

đây là mã cho sự kiện nhấn nút

btnLive.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

     try 
     { 
      String name = ((Button)v).getText().toString(); 
      if(name.equalsIgnoreCase("Live")) 
      { 
       DataOutputStream dos; 
       DataInputStream dis; 
       String reply; 

       if(config.conn.isConnected()) 
       { 
        dos = new DataOutputStream(config.conn.getOutputStream()); 
        dos.writeBytes("STREAM-LIVE-IMAGES");          
        dos.flush(); 
        //dis = new DataInputStream(in); 

        in = config.conn.getInputStream();      
        while (true) 
        {        
         new myTask().execute(in); 
        } 
       }     
      } 
     } 
     catch(Exception ex) 
     { 
      Log.d("Live Button ", "Exception " + ex.getMessage()); 
     } 
    } 
}); 

và điều này mã cho AsyncTask

class myTask extends AsyncTask<InputStream, Integer, Bitmap> { 

protected Bitmap doInBackground(InputStream...in) 
{ 
    Bitmap bmp = null; 

    try 
    { 
     //Do some none UI stuff here and return a value *result     
     byte[] rcvPacket = ReadJpegBinaryAndRemoveDelimiter(in[0]); 
     bmp = BitmapFactory.decodeByteArray(rcvPacket, 0, rcvPacket.length); 
     Log.d("Live Image Streaming ", "Recieved Images: " + rcvPacket.length + " " + bmp); 

    } catch (Exception e) { 
     e.printStackTrace();      
    } 
    return bmp; 
} 
các
+0

Bạn không thể thực thi bao nhiêu AsyncTask như bạn muốn. Có giới hạn cho điều đó. – ania

+0

Tôi đoán sẽ tốt hơn khi triển khai Dịch vụ để tải lên. Chạy Dịch vụ này và chuyển đến đó bitmap của bạn. – Yury

Trả lời

0

Tôi đã quản lý để sắp xếp nó bằng chuỗi nền vì asynctask không phải là tùy chọn phù hợp cho vấn đề của tôi.

Vì vậy, tôi đã tạo một chuỗi nền riêng và sử dụng phương thức chạy sau trên lần xem hình ảnh để cập nhật giao diện người dùng.

3
while (true) {        
new myTask().execute(in); 
} 

vì bạn đang thực hiện AsyncTask trong vòng lặp, trong trường hợp của bạn trong vòng lặp vô hạn, âm thanh không tốt lắm, bạn cần thay đổi nó.

Bạn cần thực hiện ngoài vòng lặp. Bạn không nên, musn't làm điều đó.

Chỉ cần gọi

new myTask().execute(in); 

mà không cần vòng lặp.

+0

do đó, asynctask sẽ tự chạy vì tôi cần phải tiếp tục phát hình ảnh cho đến khi tôi muốn dừng phát trực tuyến? Cảm ơn bạn đã trả lời nhanh –

+1

chỉ đơn giản là không thực hiện nó trong vòng lặp. mỗi khi bạn bấm vào nút chỉ cần thực hiện asynctask và để cho nó làm công việc của mình. – Sajmon

+0

Vì vậy, điều đó sẽ không cho tôi hình ảnh sống liên tục sau đó? những gì tôi cần cũng giống như khi tôi nhấn nút trực tiếp, nó sẽ liên tục truyền hình ảnh. Giải pháp của bạn sẽ chỉ đưa tôi một hình ảnh với mỗi lần nhấp nút, tôi đoán là –

Các vấn đề liên quan