简体   繁体   English

Android Studio - UI 线程未使用异步任务更新

[英]Android Studio - UI Thread not updating with Async Task

i have following problem: I have a mobile App which, on button click ("yesbutton") fetches data from server in an Async Task (which works fine).我有以下问题:我有一个移动应用程序,单击按钮(“yesbutton”)从异步任务中的服务器获取数据(工作正常)。 While that task is running, I want my app to display a Layout (framelayout), which I set to invisible at creation and which contains a textview and a Circle Progressbar.在该任务运行时,我希望我的应用程序显示一个布局(框架布局),我在创建时将其设置为不可见,其中包含一个 textview 和一个圆形进度条。 So i put the line where i set it visible into my onPreExecute method in my Asnyc task, because i read that this method will be executed on the UI Thread.所以我把我设置它的行放在我的 Asnyc 任务中的 onPreExecute 方法中,因为我读到这个方法将在 UI 线程上执行。

But this framelayout is only showing after my whole code has run, but not while executing.但是这个框架布局只在我的整个代码运行后显示,而不是在执行时显示。

Here is my code, I removed a chunk from it where i dont think the problem is, to make it more readable for you.这是我的代码,我从其中删除了一个我认为不存在问题的块,以使其更具可读性。

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??
}

Write this Part:写这部分:

//wait until picture on Phone
    File xaifile = new File(Environment.getExternalStorageDirectory() + "/image_from_server.jpg");
    while (true){
        if (xaifile.exists()){
            break;
        }
    }
    replacePicture(xaifile);

in onPostExecute在 onPostExecute

Currently You are Blocking Main Thread.当前您正在阻塞主线程。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM