繁体   English   中英

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

[英]Android Background Task - how to access return value

当后台任务返回一个值时,如何从另一个类进行访问。 仅使用此作为示例代码,但是我想要的是后台任务来做某事并返回一个值。

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;**
}

为此,您需要扩展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);
}

如果您需要在另一个类中访问它,则可以为此编写列表器并在您的活动中实施

public class MyActivity extends Activity implements PrintListner{

       @Override
       public void getResult(String receiptItem){
        //Do whatever you want
       }
    }   

并像new AsyncTaskGetResult(this).execute(yourString);一样调用它

AsyncTask:

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);

你有点误会。 后台任务不返回值。 他们只是做某事。 如果要从后台执行的某些计算中获取一个值,则可以执行后台任务,以便在完成任务时将结果值通知某些对象。

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

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

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();
    ...

暂无
暂无

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

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