0

누군가 CountDownTimer을 사용할 때 progressBar.setVisibility()이 작동하지만 async을 다운로드 할 때 작동하지 않는 이유를 이해할 수 있습니까? 실제로, 에있는 첫 번째 Toast은 두 번째 것인데도 표시되지 않습니다. onPostExecute(). 아래는 작동하는 또는 작동하지 않는 데모입니다. 고마워.안드로이드 progressBar setVisibility() 작동하지 않음

MainActivity :

public class MainActivity extends AppCompatActivity { 

    ProgressBar progressBar; 

    int[] items = { 12982418, 12998698, 12993549, 12995125, 12987537, 12993021, 12991986, 13008408, 12983417, 12986060, 12998395, 12985644, 13014731, 12986433, 12985074, 12994455, 12994262, 12986759, 13011932, 13005211, 12993521, 12987900, 12992623, 12981736, 12986649, 12991524, 13000035, 12989278, 13013868, 13009417, 13013327, 12981605, 12985768, 13000158, 13015035, 13002596, 13015944, 12997893, 12999767, 13010949, 12996835, 13013517, 13006555, 13013143, 13010016, 13005792, 13016948, 13007235, 12998343, 12987102 }; 
    int counter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     progressBar = (ProgressBar) findViewById(R.id.progressBar); 
     progressBar.setIndeterminate(true); 
     progressBar.setKeepScreenOn(true); 
     progressBar.setVisibility(View.INVISIBLE); 
    } 

    public void actionTimer(View view) { 
     Toast.makeText(this, "starting progressBar - CountDownTimer", Toast.LENGTH_SHORT).show(); 
     progressBar.setVisibility(View.VISIBLE); 
     new CountDownTimer(5000, 500) { 
      @Override 
      public void onTick(long millisUntilFinished) { 
      } 
      @Override 
      public void onFinish() { 
       progressBar.setVisibility(View.INVISIBLE); 
       Toast.makeText(getApplicationContext(), "timer done", Toast.LENGTH_SHORT).show(); 
      } 
     }.start(); 
    } 

    public void actionJson(View view) { 
     Toast.makeText(this, "starting progressBar - json fetch", Toast.LENGTH_SHORT).show(); 
     progressBar.setVisibility(View.VISIBLE); 

     String urlTemplate = "https://hacker-news.firebaseio.com/v0/item/___ITEM_NUMBER___.json?print=pretty"; 
     counter = 0; 

     for (int i = 0; i < items.length; i++) { 
      String url = urlTemplate.replaceAll("___ITEM_NUMBER___", String.valueOf(items[i])); 
      //Log.i("thisDoesNotWork", url); 

      DownloadJson downloadJson = new DownloadJson(); 
      try { 
       downloadJson.execute(url).get(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } catch (ExecutionException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public class DownloadJson extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      Log.i("DownloadJson", "url=" + params[0]); 

      URL url; 
      HttpURLConnection urlConnection = null; 

      try { 
       url = new URL(params[0]); 
       urlConnection = (HttpURLConnection) url.openConnection(); 
       InputStream inputStream = urlConnection.getInputStream(); 

       BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
       StringBuilder resultBuilder = new StringBuilder(); 
       String line; 
       while ((line = reader.readLine()) != null) { 
        resultBuilder.append(line).append("\n"); 
       } 
       //Log.i("DownloadJson", "resultBuilder.length()=" + resultBuilder.length()); 
       return resultBuilder.toString(); 

      } catch (Exception e) { 
       e.printStackTrace(); 
       return "{\"status\" : \"Hacker News json download failed\"}"; 
      } 
     } 

     @Override 
     public void onPostExecute(String s) { 
      super.onPostExecute(s); 
      counter += 1; 
      if (counter == items.length) { 
       progressBar.setVisibility(View.INVISIBLE); 
       Toast.makeText(getApplicationContext(), "download done", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
} 

XML :

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.plaudev.progressbar.MainActivity"> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center_vertical"> 

     <Button 
      android:text="@string/timer" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_centerHorizontal="true" 
      android:id="@+id/buttonTimer" 
      android:layout_weight="1" 
      android:onClick="actionTimer" 
      android:layout_margin="25dp" /> 

     <Button 
      android:text="@string/json" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/buttonJson" 
      android:layout_weight="1" 
      android:onClick="actionJson" 
      android:layout_margin="25dp" /> 
    </LinearLayout> 

    <ProgressBar 
     style="?android:attr/progressBarStyleLarge" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
     android:id="@+id/progressBar" /> 
</RelativeLayout> 
+0

doInBackground 작업을 완료하는 데 얼마나 걸리나요? 그것이 완료되고 진행률 표시 줄이 UI에 표시되기 전에 보이지 않게 설정 될 수 있습니다. – mWhitley

+0

onPostExecute는 UI 스레드에서 실행됩니다. inVisible 대신 GONE을 사용해보십시오. 죄송하지만 항상 사용 하시려면 –

+0

두 분 모두에게 감사드립니다. 이미 GONE을 시도했지만 작동하지 않습니다. Btw는 CountDownTimer 메서드가 동일한 INVISIBLE에서 작동하는 이유를 설명하지 않습니다. 다운로드는 몇 초 만에 완료됩니다. – rockhammer

답변

0

대답은 noted here으로 다음과 같이 작업자 스레드에 온 클릭 actionJson()에 전체 for 루프를 넣어하는 것입니다 :

public void actionJson(View view) { 
     Toast.makeText(this, "starting progressBar - json fetch", Toast.LENGTH_SHORT).show(); 
     progressBar.setVisibility(View.VISIBLE); 

     final String urlTemplate = "https://hacker-news.firebaseio.com/v0/item/___ITEM_NUMBER___.json?print=pretty"; 
     counter = 0; 

     // simply put it in a worker thread does the job 
     new Thread(new Runnable() { 
      public void run() { 
       for (int i = 0; i < items.length; i++) { 
        String url = urlTemplate.replaceAll("___ITEM_NUMBER___", String.valueOf(items[i])); 
        //Log.i("actionJson", url); 
        DownloadJson downloadJson = new DownloadJson(); 
        try { 
         downloadJson.execute(url).get(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } catch (ExecutionException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }).start(); 
    } 

원래 정의한대로 for 루프가 전체적으로 asyncTasks 묶음을 생성하더라도 여전히 주 스레드를 차단하고 있습니다.