publishProgress from inside a function in doInBackground?

前端 未结 5 777
名媛妹妹
名媛妹妹 2020-12-15 17:20

I use an AsyncTask to perform a long process.

I don\'t want to place my long process code directly inside doInBackground. Instead my long process code is located in

5条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-15 17:49

    A solution could be placing a simple public class inside the AsyncTask (make sure the task you define is also public) which has a public method that calls publishProgress(val). Passing that class should be available from any other package or class.

    public abstract class MyClass {
    
        public MyClass() {
            // code...
        }
    
        // more code from your class...
    
        public class Task extends AsyncTask {
            private Progress progress;
    
            protected Task() {
                this.progress = new Progress(this);
            }
    
            // ...
    
            @Override
            protected Integer doInBackground(String... params) {
                // ...
                SomeClass.doStuff(progress);
                // ...
            }
    
            // ...
    
            @Override
            protected void onProgressUpdate(Integer... progress) {
                // your code to update progress
            }
    
            public class Progress {
                private Task task;
    
                public Progress(Task task) {
                    this.task = task;
                }
    
                public void publish(int val) {
                    task.publishProgress(val);
                }
            }
        }
    }
    

    and then in the other class:

    public class SomeClass {
        public static void doStuff(Progress progress){
            // do stuff
            progress.publish(20);
            // more stuff etc
        }
    }
    

    This worked for me.

提交回复
热议问题