Android Studio - UI 线程未使用异步任务更新
Android Studio - UI Thread not updating with Async Task
我有以下问题:我有一个移动应用程序,点击按钮(“yesbutton”)在异步任务中从服务器获取数据(工作正常)。虽然该任务是 运行ning,但我希望我的应用程序显示一个布局 (framelayout),我在创建时将其设置为不可见,其中包含一个文本视图和一个圆形进度条。所以我把我设置它可见的行放在我的 Asnyc 任务的 onPreExecute 方法中,因为我读到这个方法将在 UI 线程上执行。
但是这个框架布局只在我的整个代码有 运行 之后显示,而不是在执行时显示。
这是我的代码,我从中删除了一块我认为没有问题的地方,以提高代码的可读性。
public class KeepImageActivity extends AppCompatActivity {
private static final int PORT_NO = 1234;
private String pathname;
private File imgFile;
private Button yesbutton;
private Button nobutton;
private ImageView imageView;
private FrameLayout frameLayout;
@SuppressLint("SourceLockedOrientationActivity")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.activity_keep_image);
Intent receivedIntent = getIntent();
pathname = receivedIntent.getStringExtra(CameraActivity.EXTRA_MESSAGE);
imgFile = new File(pathname);
imageView = findViewById(R.id.imageViewID);
yesbutton = findViewById(R.id.yesbuttonID);
nobutton = findViewById(R.id.discardbuttonID);
nobutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onDiscard(pathname);
}
});
yesbutton.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onClick(View view) {
onYes();
}
});
frameLayout = findViewById(R.id.framelayout);
frameLayout.setVisibility(View.GONE);
showImage();
}
//method to show a picture in an ImageView
private void showImage() {
imgFile = new File(pathname);
Bitmap bitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
imageView.setRotation(90);
imageView.setImageBitmap(bitmap);
}
private void onDiscard(String pathname) {
//....not relevant
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void onYes() {
//doInBackground just fetches data and writes to jpg
class ConnectTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
//doing stuff (connection to server and downloading image ("image_from_server"))
}
@Override
//here my frameLayout is not being set to Visible, at least not DURING execution.
protected void onPreExecute() {
frameLayout.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(Void aVoid) {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
ConnectTask connect = new ConnectTask();
Void[] param = null;
//execute Async task
connect.execute(param);
//wait until picture on Phone
File xaifile = new File(Environment.getExternalStorageDirectory() + "/image_from_server.jpg");
while (true){
if (xaifile.exists()){
break;
}
}
replacePicture(xaifile);
}
//here i replace the picture/bitmap in the ImageView with another one (that just came from server)
private void replacePicture(File xaifile) {
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/image_from_server.jpg");
imageView.setRotation(90);
imageView.setImageBitmap(bitmap);
//finished loading, I commented this line to see if my Layout would show afterwards. It does.
//frameLayout.setVisibility(View.INVISIBLE);
//delete both files, not needed anymore
xaifile.delete();
imgFile.delete();
}
//AND IT SEEMS LIKE HERE IS THE MOMENT THAT THE UPDATE TO THE UI IS SHOWN. WHY??
}
写这部分:
//wait until picture on Phone
File xaifile = new File(Environment.getExternalStorageDirectory() + "/image_from_server.jpg");
while (true){
if (xaifile.exists()){
break;
}
}
replacePicture(xaifile);
在 onPostExecute
当前您正在阻塞主线程。
我有以下问题:我有一个移动应用程序,点击按钮(“yesbutton”)在异步任务中从服务器获取数据(工作正常)。虽然该任务是 运行ning,但我希望我的应用程序显示一个布局 (framelayout),我在创建时将其设置为不可见,其中包含一个文本视图和一个圆形进度条。所以我把我设置它可见的行放在我的 Asnyc 任务的 onPreExecute 方法中,因为我读到这个方法将在 UI 线程上执行。
但是这个框架布局只在我的整个代码有 运行 之后显示,而不是在执行时显示。
这是我的代码,我从中删除了一块我认为没有问题的地方,以提高代码的可读性。
public class KeepImageActivity extends AppCompatActivity {
private static final int PORT_NO = 1234;
private String pathname;
private File imgFile;
private Button yesbutton;
private Button nobutton;
private ImageView imageView;
private FrameLayout frameLayout;
@SuppressLint("SourceLockedOrientationActivity")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.activity_keep_image);
Intent receivedIntent = getIntent();
pathname = receivedIntent.getStringExtra(CameraActivity.EXTRA_MESSAGE);
imgFile = new File(pathname);
imageView = findViewById(R.id.imageViewID);
yesbutton = findViewById(R.id.yesbuttonID);
nobutton = findViewById(R.id.discardbuttonID);
nobutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onDiscard(pathname);
}
});
yesbutton.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onClick(View view) {
onYes();
}
});
frameLayout = findViewById(R.id.framelayout);
frameLayout.setVisibility(View.GONE);
showImage();
}
//method to show a picture in an ImageView
private void showImage() {
imgFile = new File(pathname);
Bitmap bitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
imageView.setRotation(90);
imageView.setImageBitmap(bitmap);
}
private void onDiscard(String pathname) {
//....not relevant
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void onYes() {
//doInBackground just fetches data and writes to jpg
class ConnectTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
//doing stuff (connection to server and downloading image ("image_from_server"))
}
@Override
//here my frameLayout is not being set to Visible, at least not DURING execution.
protected void onPreExecute() {
frameLayout.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(Void aVoid) {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
ConnectTask connect = new ConnectTask();
Void[] param = null;
//execute Async task
connect.execute(param);
//wait until picture on Phone
File xaifile = new File(Environment.getExternalStorageDirectory() + "/image_from_server.jpg");
while (true){
if (xaifile.exists()){
break;
}
}
replacePicture(xaifile);
}
//here i replace the picture/bitmap in the ImageView with another one (that just came from server)
private void replacePicture(File xaifile) {
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/image_from_server.jpg");
imageView.setRotation(90);
imageView.setImageBitmap(bitmap);
//finished loading, I commented this line to see if my Layout would show afterwards. It does.
//frameLayout.setVisibility(View.INVISIBLE);
//delete both files, not needed anymore
xaifile.delete();
imgFile.delete();
}
//AND IT SEEMS LIKE HERE IS THE MOMENT THAT THE UPDATE TO THE UI IS SHOWN. WHY??
}
写这部分:
//wait until picture on Phone
File xaifile = new File(Environment.getExternalStorageDirectory() + "/image_from_server.jpg");
while (true){
if (xaifile.exists()){
break;
}
}
replacePicture(xaifile);
在 onPostExecute
当前您正在阻塞主线程。