Android 在应用程序类中启动异步任务;使用侦听器通知活动

Android 在应用程序类中启动异步任务;使用侦听器通知活动,android,android-asynctask,Android,Android Asynctask,我从Application类开始,在onCreate中,一个后台线程(AsyncTask),它执行一些耗时的工作(15-70秒) 在活动中,仅当在应用程序onCreate()方法中启动的任务完成时,我才需要执行一些操作 我的解决方案是: 应用程序类 使用单个方法创建接口 在AsyncTaskonPostExecute方法中,我更新侦听器 我还有一个boolean变量,可以从poutside知道asyncTask是否正在进行或终止 MyActivityclass 我实现了侦听器 按下按钮时:

我从
Application
类开始,在
onCreate
中,一个后台线程(
AsyncTask
),它执行一些耗时的工作(15-70秒)

在活动中,仅当在
应用程序
onCreate()
方法中启动的任务完成时,我才需要执行一些操作

我的解决方案是:

应用程序
  • 使用单个方法创建接口
  • AsyncTask
    onPostExecute
    方法中,我更新
    侦听器
  • 我还有一个
    boolean
    变量,可以从poutside知道
    asyncTask
    是否正在进行或终止
MyActivity
class
  • 我实现了
    侦听器
  • 按下按钮时:
    • 如果
      asyncTask
      正在进行,我将设置
      listener
      ,当
      asyncTask
      完成并在那里执行操作时,我将在
      oncommanded
      中收到通知
    • 如果asyncTask任务完成,我将在这里执行以下操作
我不确定这是不是正确的方法

import android.app.Application;
import android.content.Context;
import android.os.AsyncTask;

public class MyApplicationClass extends Application {

    protected static MyApplicationClass instance;

    public static MyApplicationClass getInstance() {
        return instance;
    }

    private ApplicationListener listener;
    public void setListener(ApplicationListener listener) {
        this.listener = listener;
    }
    public static interface ApplicationListener {
        void onCommandEnded();
    }

    private boolean isInProgress;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;

        CommandAsyncTask copyFfmpeg = new CommandAsyncTask();
        copyFfmpeg.execute();
    }

    private class CommandAsyncTask extends AsyncTask<Void, Void, Double> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            isInProgress = true;
        }
        @Override
        protected Double doInBackground(Void... params) {
            //do some time consuming operations here
            return null;
        }
        @Override
        protected void onPostExecute(Double aDouble) {
            if (listener != null) {
                listener.onCommandEnded();
            }
            isInProgress = false;
            super.onPostExecute(aDouble);
        }
    }

    public boolean isInProgress() {
        return isInProgress;
    }
}




import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MyActivity extends Activity implements MyApplicationClass.ApplicationListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (MyApplicationClass.getInstance().isInProgress()) {
                    MyApplicationClass.getInstance().setListener(MyActivity.this);
                } else {
                    //start new asynctask
                }
            }
        });
    }

    @Override
    public void onCommandEnded() {
        //start here new asynctask
    }
}





<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">
    <Button
            android:id="@+id/button"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Hello World, MyActivity"
            />
</LinearLayout>
导入android.app.Application;
导入android.content.Context;
导入android.os.AsyncTask;
公共类MyApplicationClass扩展了应用程序{
受保护的静态MyApplicationClass实例;
公共静态MyApplicationClass getInstance(){
返回实例;
}
私有应用程序侦听器;
public void setListener(ApplicationListener侦听器){
this.listener=listener;
}
公共静态接口ApplicationListener{
void oncommanded();
}
私有布尔isInProgress;
@凌驾
public void onCreate(){
super.onCreate();
实例=此;
CommandAsyncTask copyFfmpeg=新CommandAsyncTask();
copyFfmpeg.execute();
}
私有类CommandAsyncTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
isInProgress=true;
}
@凌驾
受保护的双doInBackground(无效…参数){
//在这里执行一些耗时的操作
返回null;
}
@凌驾
PostExecute上受保护的void(双倍){
if(侦听器!=null){
listener.oncommanded();
}
isInProgress=false;
super.onPostExecute(aDouble);
}
}
公共布尔值isInProgress(){
返回isInProgress;
}
}
导入android.app.Activity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.Button;
公共类MyActivity扩展活动实现MyApplicationClass.ApplicationListener{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button Button=(Button)findViewById(R.id.Button);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(MyApplicationClass.getInstance().isInProgress()){
MyApplicationClass.getInstance().setListener(MyActivity.this);
}否则{
//启动新的异步任务
}
}
});
}
@凌驾
要求的公共空间(){
//从这里开始新的异步任务
}
}

在服务类开始您的任务,使用广播接收器通知活动。您能给我举个例子吗?thansk很多。只有当您需要后台操作才能与不同的活动进行通信时,才使用服务。您的实现到底有什么问题?我不确定应用程序类和活动之间的通信是否正确。事实上,有两个活动需要了解该任务。