2012-01-17 2 views
1

Мне нужно сделать это, чтобы воспроизводить видео в одном действии, количество видео не определено, может быть от 1 до 8, видео в моем случае - последовательность изображений, где каждое изображение загружается с камеры на Интернет с использованием фиксированного интервала времени.Несколько изображений Просмотр в Android с помощью asynctasks?

Выполнение одной видеоинформации не является проблемой, я могу сделать это с помощью ImageView и AsyncTask, используя многие экземпляры этого метода, когда я пытаюсь сделать несколько действий с видео, не работает, воспроизводится только одно из видео. Я не знаю точно, что это происходит, но я думаю, что это может быть проблема, связанная с cuncurrency из-за UIThread.

Здесь используется AsyncTask код:

private class AsyncTask_LiveView extends AsyncTask<String, Integer, Void> 
{ 
    private String sImageMessage = ""; 

    private final WeakReference<ImageView> imageViewReference; 
    private Bitmap bmImage = null; 
    private String url = ""; 
    private String usr = ""; 
    private String pwd = ""; 
    private utils u = new utils(); 

    public AsyncTask_LiveView(ImageView imageView, String Url, String Usr, String Pwd) 
    { 
     imageViewReference = new WeakReference<ImageView>(imageView); 
     url = Url; 
     usr = Usr; 
     pwd = Pwd; 
    } 

    // automatically done on worker thread (separate from UI thread) 
    @Override 
    protected Void doInBackground(final String... args) 
    { 
     while(!isCancelled()) 
     { 
      if(isCancelled()) 
       return null; 

      SystemClock.sleep(200); 

      Log.v("ImageDownload","test"); 
      bmImage = u.DownloadBitmapFromUrl(url, usr, pwd); 

      publishProgress(0); 
     } 

     return null; 
    } 

    // can use UI thread here 
    @Override 
    public void onProgressUpdate(Integer... i) 
    { 
     Log.v("Image", "Setup Image"); 
     if (imageViewReference != null) { 
      ImageView imageView = imageViewReference.get(); 
      if (imageView != null) { 
       imageView.setImageBitmap(bmImage); 
      } 
     } 
    } 
} 

я начинаю AsyncTasks следующим образом:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.layoutliveviewdouble); 

     this.imgV1 = (ImageView) findViewById(R.id.imageView1); 
    aTaskImgV1 = new AsyncTask_LiveView(imgV1, 
             URL1, 
             "", 
             ""); 


    this.imgV2 = (ImageView) findViewById(R.id.imageView2); 
    aTaskImgV2 = new AsyncTask_LiveView(imgV2, 
             URL2, 
             "root", 
             "jenimex123"); 

    aTaskImgV1.execute(); 
    aTaskImgV2.execute(); 
} 

Метод DownloadBitmapFromUrl является:

public Bitmap DownloadBitmapFromUrl(String imageURL, final String usr, final String pwd) { //this is the downloader method 
    try { 
     URL url = new URL(imageURL); 


     /* Open a connection to that URL. */ 
     HttpURLConnection ucon = (HttpURLConnection) url.openConnection(); 
     ucon.setRequestMethod("GET"); 
     ucon.setDoOutput(true); 
     Authenticator.setDefault (new Authenticator() { 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication (usr, pwd.toCharArray()); 
      } 
     }); 
     ucon.connect(); 

     /* 
     * Define InputStreams to read from the URLConnection. 
     */ 
     InputStream is = ucon.getInputStream(); 
     BufferedInputStream bis = new BufferedInputStream(is); 

     /* 
     * Read bytes to the Buffer until there is nothing more to read(-1). 
     */ 
     ByteArrayBuffer baf = new ByteArrayBuffer(100000); 
     int current = 0; 
     while ((current = bis.read()) != -1) { 
       baf.append((byte) current); 
     } 

     /* Convert the Bytes read to a String. */ 
     Bitmap bmp = BitmapFactory.decodeByteArray(baf.toByteArray(), 0, baf.length()); 

     return bmp; 
    } catch (Exception e) { 
      //Log.d("ImageManager", "Error: " + e); 
     return null; 
    } 
} 

Любые идеи?

Решение: (21/01/11)

bounch линий:

Authenticator.setDefault (new Authenticator() { 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication (usr, pwd.toCharArray()); 
      } 
     }); 

были тормозного механизма. Фактически, только одна пара учетных данных a могла быть установлена ​​глобально, а другие процессы загрузки застряли в запросе с использованием неправильных учетных данных.

Решение:

String authString = usr + ":" + pwd; 
byte[] authEncBytes = Base64.encode(authString.getBytes(), Base64.DEFAULT); 
String authStringEnc = new String(authEncBytes); 
ucon = (HttpURLConnection) url.openConnection(); 

if(_usr != "") 
    ucon.setRequestProperty("Authorization", "Basic " + authStringEnc); 

Спасибо всем.

+0

Как вы начинаете эти AsyncTasks? –

+0

Код был опубликован. – user1153469

+0

Не могли бы вы показать мне журнал вокруг места, где он застрял (15-20 строк)? –

ответ

0

Я думаю, что yuo должен использовать уникальный AsyncTask_LiveView для каждого ImageView.

+0

Я сделал, но с этим методом работает только один видеопоток. – user1153469

0

Поддерживает ли эта функция несколько потоков?

bmImage = u.DownloadBitmapFromUrl(url, usr, pwd); 
+0

Объект «u» - это новый экземпляр в каждой AsyncTask, так что я думаю, что это так. – user1153469

0

Похоже, что некоторые из методов, которые вы вызываете в методе downloadBitmapFromUrl (..), включают синхронизацию с помощью некоторого общего объекта. Попробуйте добавить некоторые дополнительные протоколирования в каждую часть этого метода и посмотреть, где застрял каждый поток. Я бы сделал это следующим образом:

public Bitmap downloadBitmapFromUrl(String imageURL, final String usr, final String pwd) { //this is the downloader method 
    try { 
    ... 
    Log.i(toString() + " in " + Thread.currentThread(), "is about to open connection..."); 
    HttpURLConnection ucon = (HttpURLConnection) url.openConnection(); 
    Log.i(toString() + " in " + Thread.currentThread(), "has opened connection"); 

    ... 

и так далее.

+0

Вышло, что другой заблокированный AsyncTask (я тестирую только 2 видеопоток) застрял на while ((current = bis.read())! = -1) { baf.append ((byte) текущий); } еще раз: любые идеи? Заранее спасибо. – user1153469

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

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