2011-02-03 11 views
1

非同期タスクを使用してMJPGストリームからJPGを取得しようとしています。私は最初に、私はタスクを継続的に実行させ、バッファされたJPGを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を(){} 公共ラン(){ imView.setImageDrawable(画像を)}してみてください。 –

1

あなたはAsyncTaskを開始

は、doInBackgroundが呼び出されますが、それは一度だけ実行されます。私はreadMJPGStreamが何をしているのかは分かりませんが、イメージが取り出されるまでブロックされていると仮定すると、あなたのイメージがまだヌルである間にonProgressUpdateが何度か呼び出される可能性があります。それ以降はOnProgressUpdateを呼び出しません。

onPostExecuteimView.setImageDrawableを呼び出して、画像がダウンロードされたときに呼び出されるようにしてください。イメージビューでinvalidate()に電話して、再描画されるようにする必要があります。また、イメージをループしてダウンロードを続行する場合は、更新をトリガーするメカニズムを考案する必要があります。実際には、あなたが持っている問題は、あなたが「オンデマンド」のUIスレッドを手に入れたいからですが、onProgressUpdateへの呼び出しに依存しています。 onProgressUpdateを待つことなく、画像のダウンロードが完了したら、Handlerを使用してUIスレッドに投稿することができるので、Handlerと独自のRunnable/Threadを使用すると、より良い運を得られます。

+0

タンクニックは、はい私はTUが連続的に 'doInBackground'を使用する方法があった、と思いました。私が一度だけ使用すると、 'imView.setImageDrawable'は' onPostExecute'にうまく描画されます。私は今Runnable/Threadに別のショットを与えます。 'invalidate()'も良いヒントでした!あなたのrunメソッドでは ; –

関連する問題