2017-01-20 1 views
-5

클라우드 서버와 통신하는 앱을 개발했습니다. 이제 데이터를로드 할 때 피드백을 추가하고 싶습니다. 예를 들어 사용자가 "데이터 가져 오기"버튼을 클릭하여 데이터를로드하면 버튼 텍스트가 "로드 중"으로 변경됩니다. 데이터가로드되면 텍스트가 다시 "데이터 가져 오기"가됩니다.데이터를로드하기 전에보기를 렌더링하는 방법

그러나 첫 시도는 효과가 없었으며 일부 연구를 수행했습니다. 작업이 완료 될 때까지 뷰가 렌더링되지 않기 때문입니다. (AsyncTask를 사용하여 데이터를로드했습니다.) 그리고 온라인 솔루션이 onPreExecute() 및 onPostExecute() 메서드에서 뷰를 렌더링해야한다는 것을 알았 기 때문에이 방법을 시도했습니다. 글쎄, 그것도 작동하지 않습니다.

모든 AsyncTask가 완료된 후에 만 ​​렌더링 작업이 수행되도록하는 제약이있는 것처럼 보입니다.

누군가 나를 밝힐 수 있습니까? 그것은 꽤 오랫동안 나를 괴롭혔습니다.

+1

enter image description here

는 텍스트 뷰에 onPreExecute에서 "...로드"당신의 코드 – meda

+0

단지 설정 텍스트를 표시하고 onPostExecute에서 "데이터 가져 오기" – 44kksharma

+0

내가 문제를 알아 냈어요 다시 텍스트를 설정합니다. UI 스레드를 차단하므로 AsyncTask.get()을 호출하지 마십시오. AsyncTask.execute()를 호출하면 충분하며 postExecute()에서 UI 업데이트를 수행합니다. –

답변

0

CloudPilot 작업에 대해 Retrofit을 제안했지만 AsyncTask를 사용하려면 괜찮습니다. 또한 ProgressBar/Dialog 대신 텍스트 만 업데이트하는 것이 좋습니다.

작업이

불분명 완료 될 때까지 뷰가 렌더링되지 않습니다

...

나는 (솔루션 온라인 내가 onPreExecute에서보기를 렌더링해야 함을 알려 있음) 및 onPostExecute() 메서드를 사용하므로이 방법을 시도했습니다. 당신은 당신이을 시도 무엇 을 표시해야합니다 그래서 음, 어느

예, 즉 일하는 것이 작동하지 않습니다.

그것은 AsyncTask를 완료 한 모든 후에만 수행 할 수있는 렌더링 작업을 강제로 제약이 있다는 것

네, 당신은 UI의 외부 UI를 업데이트 할 수 없습니다 제한 실. 이것이 onPreExecute와 onPostExecute가 존재하는 이유입니다.


나는 이러한 방법을 사용할 수 있습니다.

public class ButtonActivity extends android.support.v7.app.AppCompatActivity implements View.OnClickListener { 

    private Button button; 
    private ProgressBar pg; 

    @Override 
    protected void onCreate(Bundle b) { 
     super.onCreate(b); 
     setContentView(...); 

     button = (Button) findViewById(...); 
     button.setOnClickListener(this); 

     pg = (ProgressBar) findViewById(...); 
     setLoading(false); 
    } 

    private void setLoading(boolean loading) { 
     button.setText(loading ? "loading" : "get data"); 
     pg.setVisibility(loading ? View.VISIBLE : View.GONE); 
    } 

    @Override 
    public void onClick(View v) { 
     new BackgroundTask().execute(); 
    } 

    private class BackgroundTask extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      setLoading(true); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       // some long operation 
       Thread.sleep(3000); 
      } catch (InterruptedException e) { } 

      return null; 
     } 


     @Override 
     public void onPostExecute(Void result) { 
      setLoading(false); 
     } 
    } 
} 
+0

정보 주셔서 감사합니다. 사실, ProgressBar를 사용하려고합니다. 그러나 나는 같은 문제를 만났다. ProgressBar도 뷰이기 때문에 단추 텍스트를 사용하여 시연하는 것이 같을 것이라고 생각했습니다. 문제는 귀하의 코드가 내 문제와 동일한 문제가 있다는 것입니다. AsyncTask가 끝날 때까지 Button이 렌더링되지 않으므로 button.setText ("loading"); AsyncTask가 끝날 때까지 기다렸다가 onPostExecute() 메서드를 누르면 텍스트가 변경되어 사용자에게 눈에 보이는 변경 사항이 없습니다. –

+0

버튼이 렌더링되지 않는다는 것을 알지 못합니다. XML은 가시성을 결정하고 나는 그것을 토글하지 않았다. –

+0

AsyncTask가 끝날 때까지 텍스트가 "로드 중"으로 업데이트되지 않는다는 의미입니다. 그러나 작업이 끝나면 즉시 onPostExecute() 메서드가 실행되고 Button 텍스트가 "get data"로 업데이트되어 첫 번째 업데이트가 눈에 띄게됩니다. –

관련 문제