2011-02-03 48 views
1

我正嘗試使用異步任務從MJPG流中檢索JPG。我首先想到的是,我可以讓任務持續運行,並讓緩衝的JPGs在onProgressUpdate()方法中彈出。但是,這似乎並沒有工作,因爲該方法只顯示整數,沒有可繪製...我的嘗試:Android:在異步背景流式傳輸任務期間顯示圖像

private class StreamTask extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 

     image = readMJPGStream(); 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
    } 

    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     imView.setImageDrawable(image); // << doesn't work 
    } 
} 

你有什麼想法?我應該嘗試什麼方法?

非常感謝您提前!

哈克

回答

0

我現在懂了這種方式運行:

public class StreamActivity extends Activity implements Runnable{ 

// ... 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    imView = (ImageView) findViewById(R.id.imView); 

    Thread thread = new Thread(this); 
    thread.start(); 
} 

@Override 
public void run() { 
    while (connected){ 
     image = readMJPGStream(); 
     handler.sendEmptyMessage(0); 
    } 
} 

private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     imView.setImageDrawable(image); 
    } 
}; 

public Drawable readMJPGStream() { 
    //... 
return image; 
} 
} 

唯一的問題是,我的while循環不夠快。任何想法都非常感謝!

哈克

+0

嘗試 handler.post(新的Runnable(){ 公共run(){ imView.setImageDrawable(圖像);} } 在您的run方法。 – 2011-02-04 18:02:21

1

當您啓動的AsyncTask的doInBackground被調用,但只運行一次。我不確定readMJPGStream是做什麼的,但假設它阻塞直到圖像被檢索出來爲止,當圖像仍然爲空時onProgressUpdate會被多次調用,然後一旦圖像被設置爲有效並且doInbackground快速退出,無需撥打OnProgressUpdate

您應該將電話imView.setImageDrawable撥打onPostExecute以確保它在圖像下載完成後被調用。您可能還需要在圖像視圖上致電invalidate()以確保重繪。此外,如果您打算循環並繼續下載圖像,則需要設計觸發更新的機制。實際上,你遇到的問題是因爲你想'點播'上UI線程,但你依賴於對onProgressUpdate的調用。使用Handler和自己的Runnable/Thread可以獲得更好的運氣,因爲當圖像下載完成時,您可以在UI線程(使用Handler)上發佈內容,而無需等待onProgressUpdate

+0

坦克尼克,是的,我認爲,有一種方式使用`doInBackground`在持續的方式。如果我只使用它一次`imView.setImageDrawable`很好地在`onPostExecute`中繪製。我現在將給Runnable/Thread另外一個鏡頭。 `invalidate()`也是一個很好的提示! – 2011-02-04 15:09:33