[英]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.