我有一个android.support.v4.app.FragmentActivity(MyActivity)的子类,android.app.Service的一个子类和android.os.AsyncTask的一个子类(MyAsyncTask)。
示例代码:
MyActivity.java
onCreate(...) { // start MyService }
MyService.java
onStartCommand(...){ // execute MyAsyncTask }
MyAsyncTask.java
onPostExecute(String result) { // send result to MyActivity};
我的问题是,如果成功MyAsyncTask
,我如何将结果从MyActivity
发送。
答案 0 :(得分:0)
一种方法是将您的活动绑定到您的服务,以便他们可以共享一个公共通信渠道。
答案 1 :(得分:0)
这在一个简短的段落中不容易回答。但基本上你想要做的就是使用绑定作为你的服务。
这当然不是一项微不足道的任务,但它是优雅的方式。除了使用startService()
启动服务外,您还可以绑定到您的服务。绑定机制允许您的Activity具有指向Service类的指针。使用此指针,您可以执行任何操作,包括将Activity本身的指针传递给Service,这样服务就会有一个指向Activity的指针。
一旦Service有一个指向Activity的指针,你可以调用任何方法并设置你想要的任何变量,包括设置AsyncTask的返回值。
答案 2 :(得分:0)
您可以使用MyActivity制作SingleInstance模型。
class MyActivity extends Activity{
private static MyActivity instance;
public static MyActivity getInstance(){
return instance;
}
public void onCreate(Bundle savedInstanceState) {
instance = this;
//xxx
}
public void onDestroy() {
instance = null;
///
}
public void doSomething(){}
}
然后你可以在onPostExecute中调用MyActivity.getInstance()。doSomething();
答案 3 :(得分:0)
一些替代方案:
使用IntentService,它基本上是处理异步请求的Service
从AsyncTask
的{{1}}发送广播并在您onPostExecute
(简单示例here)
答案 4 :(得分:0)
我已经尝试过这个结构,它可以在我的应用上运行。希望它有所帮助。 创建使用异步任务和单例扩展的服务类..
<service android:name=".myService" />
服务类
public class myService extends AsyncTask<String,String,String>
{
private Activity active = null;
protected myService () {}
public static myService getInstance(Activity activity) {
myService myTask = new myService ();
myTask.active = activity;
return myTask;
}
public startTask() {
//start the async task..
this.execute(new String[] {});
}
protected void onPostExecute(String result) {
//check result sucess cond and call
active.updateActivity(result)
}
}
活动类
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myService.getInstance(this).startTask();
}
public void updateActivity(result){
//do something on activity with result...
}
答案 5 :(得分:0)
您可以通过“广播”将服务(MyAsyncTask.java和MyService.java)类的结果发送到activity(myactivity)类
这是一个例子
在你的onPostExecute(String result)方法中添加:
Intent intent = new Intent("your activity class[myactivity.java]");
intent.putExtra("RESULT", result)
sendBroadcast(intent);
和你的我的活动课 像这样接收发送广播:
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String bundle = intent.getStrings();// get resulting string and do whatever you want.
}
}
不要忘记在myactivity类中注册和取消注册广播,例如:
@Override
protected void onResume() {
super.onResume();
registerReceiver(receiver, new IntentFilter("your service class"));
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(receiver);
}