可以尝试使用异步任务来获取数据并更新UI,防止主线程被阻塞。
示例代码如下:
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
private ProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = findViewById(R.id.text_view);
mProgressBar = findViewById(R.id.progress_bar);
new MyAsyncTask().execute("http://example.com/data"); //调用异步任务
}
private class MyAsyncTask extends AsyncTask {
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressBar.setVisibility(View.VISIBLE);
}
@Override
protected String doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
return stringBuilder.toString();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
mProgressBar.setVisibility(View.GONE);
if (result != null) {
mTextView.setText(result);
} else {
mTextView.setText("Error occurred while fetching data");
}
}
}
}
在这个例子中,我们创建了一个名为MyAsyncTask的内部类,它继承自AsyncTask类。AsyncTask类是一个执行异步任务的强大类,它使我们能够在后台执行长时间运行的操作,而不会阻塞UI线程,以避免应用程序响应慢或崩溃。
在 doInBackground() 方法中,我们使用URL和HttpURLConnection对象获取数据,并使用BufferedReader和InputStreamReader对象读取从服务器返回的数据。
当获取数据后,onPostExecute() 方法更新UI线程,以显示服务器返回的数据或错误消息。如果应用程序没有获取到数据,则显示一个错误消息。
值得注意的是,异步任务必须在UI线程中调用execute()方法,才能在后台线程中执行。在例子中,我们在 onCreate() 方法中调用异步任务来获取数据,等数据获取完成后,再在 onPostExecute() 方法中更新UI线程。