Android - 重复执行线程

时间:2012-03-16 11:08:08

标签: android multithreading http android-asynctask

我是Android编程和线程新手。我想从远程服务器获取图片并显示它。 (到目前为止工作^^) 但是这张照片来自相机,所以一出现我之前下载的那张照片就需要一张新照片。这意味着,线程永远不应该停止抓取图片。 (只要活动存在。)
另外,我只想与服务器建立1个连接,然后只进行HTTP-gets。所以我必须有一个Thread可以使用的参数“连接”。

要获得一个想法 - 它应该像这样工作(但显然不是):

private class DownloadImageTask extends AsyncTask<URLConnection, Void, Bitmap> {
    /** The system calls this to perform work in a worker thread and
      * delivers it the parameters given to AsyncTask.execute() */
   private URLConnection connection = null;
    protected Bitmap doInBackground(URLConnection...connection ) {
        this.connection = connection[0];
        return getImageFromServer(connection[0]);
    }
    protected void onPostExecute(Bitmap result) {
        pic.setImageBitmap(result);
        this.doInBackground(connection);
    }
}

3 个答案:

答案 0 :(得分:0)

你应该为它设置一些延迟,但为了解决这个问题,我认为它应该是这样的:

private class DownloadImageTask extends AsyncTask<URLConnection, Void, Bitmap> {
/** The system calls this to perform work in a worker thread and
  * delivers it the parameters given to AsyncTask.execute() */
private URLConnection connection = null;
protected Bitmap doInBackground(URLConnection...connection ) {
    this.connection = connection[0];
    return getImageFromServer(connection[0]);
}
protected void onPostExecute(Bitmap result) {
    pic.setImageBitmap(result);
    this.execute("...");
}
}

答案 1 :(得分:0)

最好在Thread使用AsyncTask,因为Service适用于任务在某个时刻结束的时间。下面的东西可能适合你。除此之外,您最好使用本地protected volatile boolean keepRunning = true; private Runnable r = new Runnable() { public void run() { // methods are a bit bogus but it should you give an idea. UrlConnection c = createNewUrlConnection(); while (keepRunning) { Bitmap result = getImageFromServer(c); // that probably needs to be wrapped in runOnUiThread() pic.setImageBitmap(result); } c.close(); } }; private Thread t = null; onResume() { keepRunning = true; t = new Thread(r); t.start(); } onPause() { keepRunning = false; t = null; }

{{1}}

答案 2 :(得分:0)

异步任务只能执行一次...... 该任务只能执行一次(如果尝试第二次执行,则会抛出异常。) 看到这个..关于AsyncTask的文档 documentation on AsyncTask 我建议你使用服务下载更好... 甚至可以使用线程...

像这样

 public void run() {
    while (true) {
        //get image...
    }
}