2012-03-16 6 views
0

Android 프로그래밍 및 스레드에 익숙하지 않습니다. 원격 서버에서 그림을 가져 와서 표시하고 싶습니다. (지금까지 작동합니다 ^^) 사진은 카메라에서 가져온 것이므로 이전에 다운로드 한 사진을 표시하자 마자 새 사진이 필요합니다. 즉, 실은 결코 그림을 움켜 쥐지 않아야한다는 것을 의미합니다. (활동이 오래 지속됨에 따라)
또한 서버에 대한 연결을 설정 한 다음 HTTP 가져 오기를 수행하기 만하면됩니다. 그래서 스레드가 사용할 수있는 매개 변수 "연결"을 가져야합니다.Android - 반복적으로 스레드 실행

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

답변

0

AsyncTask이 작업은 어느 시점에서 종료 될 때를 위해이기 때문에 여기에 Thread를 사용하는 것이 좋습니다 수 있습니다. 아래와 같은 것이 당신을 위해 일할 수 있습니다. 그 외에도에서 로컬 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; 
} 
+0

고마워, 그게 많이 도움이 됐어! – user1271544

+0

한 가지 더 ... 어떻게'c.close();가 'URLConnection'을 닫을 수 있습니까? 나는 지금까지 뭔가를 발견했다. – user1271544

+0

아아아, 그렇다면'InputStream'에'.close()'가 있어야합니다. 항상 열려있는 것들을 닫아야합니다. 그래서 내가 가까운 쪽을 추가했습니다. :) – zapl

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("..."); 
} 
} 
+0

안녕하세요, 이제이 오류가 발생합니다 : 작업을 실행할 수 없습니다. 작업이 이미 실행 중입니다. – user1271544

+0

먼저 작업을 먼저 취소하십시오. – goodm

0

비동기 작업은 한 번만 실행할 수 있습니다 사용하여 더 나을 수 ... 작업은 두 번째 실행을 시도하면 예외가 발생합니다 (한 번만 실행할 수 있습니다.) 이

public void run() { 
    while (true) { 
     //get image... 
    } 
} 
,369 등이 .. 당신이 ... 다운로드 서비스를 이용하거나 스레드가 사용할 수있는 경우가 더 나은 제안 AsyncTask를 documentation on AsyncTask 에 대한 문서 ...

참조