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>
doInBackground 작업을 완료하는 데 얼마나 걸리나요? 그것이 완료되고 진행률 표시 줄이 UI에 표시되기 전에 보이지 않게 설정 될 수 있습니다. – mWhitley
onPostExecute는 UI 스레드에서 실행됩니다. inVisible 대신 GONE을 사용해보십시오. 죄송하지만 항상 사용 하시려면 –
두 분 모두에게 감사드립니다. 이미 GONE을 시도했지만 작동하지 않습니다. Btw는 CountDownTimer 메서드가 동일한 INVISIBLE에서 작동하는 이유를 설명하지 않습니다. 다운로드는 몇 초 만에 완료됩니다. – rockhammer