有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android后台任务如何访问返回值

当后台任务返回一个值时,如何从另一个类访问它。仅将此用作示例代码,但我希望后台任务执行某些操作并返回一个值

protected String doInBackground(String... params) {
    publishProgress("Sleeping..."); // Calls onProgressUpdate()
    try {
       // Do your long operations here and return the result
       int time = Integer.parseInt(params[0]);    

       // Sleeping for given time period
       Thread.sleep(time);
       resp = "Slept for " + time + " milliseconds";
   } catch (InterruptedException e) {
       e.printStackTrace();
       resp = e.getMessage();
   } catch (Exception e) {
       e.printStackTrace();
       resp = e.getMessage();
   }

   **return resp;**
}

共 (3) 个答案

  1. # 1 楼答案

    异步任务:

    public class YourBackgroundTask extends AsyncTask<String, Void, String> {
         private Callback callback;
    
         public YourBackgroundTask(Callback callback){
              this.callback = callback;
         }
    
         protected void doInBackground(String... strings) {
             // do what you have to do
             return result;
         }
    
         protected void onPostExecute(String result) {
              this.callback.onDone(result);
         }
    
         public Interface Callback{
              void onDone(String result);
         }
     }
    

    这样称呼:

    new YourBackgroundTask(yourCallback).execute(yourString);
    
  2. # 2 楼答案

    你有点误会。后台任务不返回值。他们只是做点什么。如果你想从后台的计算中得到一个值,你可以让后台任务完成,这样当它完成时,它会通知某个对象结果值

    前面的行为可以通过观察者模式完成,在该模式中,一个对象被用来观察另一个对象的事件。在这种情况下,您需要定义一个观察者(通常称为监听器),并将其传递给后台任务

    您的侦听器界面可能如下所示:

    interface ValueListener {
        public void onValueComputed(int computedValue);
    }
    

    然后一个实现类如下所示:

    class ValueListenerImpl implements MyListener {
        @Override
        public void onValueComputed(int computedValue) {
            //do something...
        }
    }
    

    (或者你可以创建一个匿名类)

    你的背景任务:

    class MyAsyncTask extends AsyncTask<Void, Void, Integer> {
        ValueListener listener;
    
        public MyAsyncTask(ValueListener valueListener) {
            this.listener = valueListener;
        }
    
        @Override
        public Integer doInBackground(Void.. params) {
            //do something...
            return someValue;
        }
    
        @Override
        public onPostExecute(Integer.. values) {
            listener.onValueComputed(values[0]);
        }
    }
    

    最后,在你的主线中,你要做:

        ...
        this.valueListener = new ValueListenerImpl();
        new MyAsyncTask(this.valueListener).execute();
        ...
    
  3. # 3 楼答案

    为此,您需要扩展asynktask类,如

    extends AsyncTask<String, String, String>
    
    @Override
    protected void onPostExecute(String result) {
        //heare result is value you return from doInBackground() method 
        //this is work on UI thread
    } 
    

    班级看起来像

    public class AsyncTaskGetResult extends AsyncTask<String, String, String> {
    
        PrintListner mPrintListner ;      
        private AsyncTaskGetResult (PrintListner mPrintListner) {
            this.mPrintListner = mPrintListner;
    
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
    
        }
        @Override
        protected String doInBackground(String... params) {
            return result;
        }
    
        @Override
        protected void onPostExecute(String result) {
        //heare result is value you return from doInBackground() method 
        //this is work on UI thread
        this.mPrintListner.getResult(result);
       }
    

    }

    public interface PrintListner {
        public void getResult(String receiptItem);
    }
    

    如果需要在另一个类中访问它,可以为此编写listner并在活动中实现

    public class MyActivity extends Activity implements PrintListner{
    
           @Override
           public void getResult(String receiptItem){
            //Do whatever you want
           }
        }   
    

    把它叫做new AsyncTaskGetResult(this).execute(yourString);