Android: отображать изображение во время асинхронной фоновой задачи - PullRequest
1 голос
/ 04 февраля 2011

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

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
    }
}

У вас есть идеи? Какой подход я должен попробовать?

Большое спасибо заранее!

Гек

Ответы [ 2 ]

1 голос
/ 04 февраля 2011

Когда вы запускаете AsyncTask, вызывается doInBackground, но он запускается только один раз. Я не уверен, что делает readMJPGStream, но при условии, что он блокируется до тех пор, пока изображение не будет получено, вполне возможно, что onProgressUpdate будет вызываться несколько раз, пока ваше изображение все еще равно нулю, а затем, когда для изображения установлено значение, допустимое и doInbackground быстро завершается, больше нет звонков на OnProgressUpdate.

Вы, вероятно, должны поместить вызов imView.setImageDrawable в onPostExecute, чтобы убедиться, что он вызывается при загрузке изображения. Вам также может понадобиться вызвать invalidate() в вашем изображении, чтобы убедиться, что оно перерисовывается. Кроме того, если вы собираетесь зациклить и продолжить загрузку изображений, вам нужно будет разработать механизм запуска обновлений. В действительности проблема заключается в том, что вы хотите, чтобы «по требованию» входило в поток пользовательского интерфейса, но вы зависите от вызовов на onProgressUpdate. Вам бы повезло больше, используя Handler и ваш собственный Runnable / Thread, потому что тогда, когда загрузка изображения завершится, вы сможете публиковать сообщения в потоке пользовательского интерфейса (используя Handler), не дожидаясь onProgressUpdate.

0 голосов
/ 04 февраля 2011

Теперь я запустил его так:

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 недостаточно быстр. Любые идеи очень ценятся!

Гек

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...