java - 从一个 Activity 启动 AsyncTask,在另一个 Activity 中获取结果

标签 java android android-asynctask

我是 Android 编程新手,我想创建一个中央数据库服务类,它将负责与外部数据库的用户数据交换。为此,我创建了一个在成功登录后启动的服务。我创建了另一个类来扩展 AsyncTask 来执行数据检索。 现在,我希望将数据检索的方法存储在服务中。我将从不同的 Activity 向服务激发 Intent ,并使用 .setAction() 我将确定要调用哪个方法,或者要检索哪些数据。

我还创建了一个接口(interface)类来处理 AsyncTask 结果。 现在,从 this question我认为可以对同一个 AsyncTask 结果有多个监听器。但现在这似乎不可能实现:我想在 MainMenuActivity 中检索 AsyncTask 结果,但我无法在那里创建 AsyncUserData 实例作为 UserData 类的委托(delegate)。在下面的示例中,缺少的部分是供 UserData 类使用的 AsyncUserData 的有效实例。我怎样才能做到呢?

示例如下: MainMenuActivity

public class MainMenuActivity extends ActionBarActivity implements AsyncUserData {
  TextView tvUsername;

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_menu);
    tvUsername =
      (TextView) findViewById(R.id.tvUsername);
    TelephonyManager tManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
    String uid = tManager.getDeviceId();
    getDataFromUserSessionService(this, uid);
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main_menu, menu);
    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_settings) {
      return true;
    }
    return super.onOptionsItemSelected(item);
  }

  @Override
  public void retrieveResult(String result) throws JSONException {
    JSONObject jsonObject = new JSONObject(result);
    String joName;
    joName = jsonObject.getJSONObject("name").toString();
    user.setName(joName);
    tvUsername.setText(joName);
  }

  public void getDataFromUserSessionService(Context context, String uid) {
    Intent intent = new Intent(context, UserSession.class);
    intent.setAction(UserSession.ACTION_FETCH_USER_DATA);
    intent.putExtra(UserSession.UID, uid);
    context.startService(intent);
  }

UserSession 服务

public class UserSession extends IntentService {
  public static final String ACTION_FETCH_USER_DATA = "com.example.blahblah.services.action.read_user_data";

  @Override
  protected void onHandleIntent(Intent intent) {
    if (intent != null) {
      utils = new Utils(this);
      final String action = intent.getAction();
      uid = intent.getStringExtra(UID);
      if (ACTION_FETCH_USER_DATA.equals(action)) {
        handleUserDataFetch(uid);
      }
    }
  }

  private void handleUserDataFetch(String uid) {
    String[] parameters = new String[2];
    parameters[0] = uid;
    parameters[1] = Constants.USER_DATA_FETCH;
    UserData userData = new UserData(this);
    userData.execute(parameters);
  }

UserData AsyncTask 类(Utils 类只有另一个 post 方法):

public class UserData extends AsyncTask < String, Void, String > {
  public AsyncUserData delegate = null;
  private Context myContext;

  public UserData(Context context) {
    myContext = context;
  }

  @Override
  protected String doInBackground(String...params) {
    String serverResponse = "";
    String uid = params[0];
    Utils utils = new Utils(myContext);
    String phpName = params[1];
    List < NameValuePair > nameValuePairs = new ArrayList < NameValuePair > ();
    nameValuePairs.add(new BasicNameValuePair("uid", uid));

    try {

      serverResponse = utils.passDataToServer(phpName, nameValuePairs);
    } catch (IOException e) {
      e.printStackTrace();
    }
    return serverResponse;
  }

  protected void onPostExecute(String result) {
    try {
      delegate.retrieveResult(result);
    } catch (JSONException e) {
      e.printStackTrace();
    }
  }

};

以及AsyncUserData接口(interface):

public interface AsyncUserData {
  void retrieveResult(String result) throws JSONException;
}

最佳答案

您可以使用单例来存储对 Activity 的引用

    public class ServiceToActivity
    {

                public ActionBarActivity mainactivity = null;
                private static ServiceToActivity singleton = null;
                public Class<?> cl = null;

                private ServiceToActivity()
                {

                }

                public static ActionBarActivity getSingleton()
                {
                    if(singleton==null)
                           return null;
                    return singleton.mainactivity;
                }

               public static Class<?> getSingletonClass()
                {
                    if(singleton==null)
                           return null;
                    return singleton.cl;
                }

                public static void setSingleton(ActionBarActivity mainactivity, Class<?> cl)
                {
                      if(singleton==null)
                             singleton = new ServiceToActivity();
                      singleton.mainactivity = mainactivity;
                      singleton.cl = cl;
                }
    }

然后在服务启动之前创建单例

  public void getDataFromUserSessionService(Context context, String uid) {
Intent intent = new Intent(context, UserSession.class);
intent.setAction(UserSession.ACTION_FETCH_USER_DATA);
intent.putExtra(UserSession.UID, uid);
ServiceToActivity.setSingleton(this,this.getClass());   //create Singleton to store a reference to the activity
context.startService(intent);
}

在 UserData 中通过以下方式将数据检索到主 Activity :

 protected void onPostExecute(String result) {
try {
  Class<?> cl = ServiceToActivity.getSingletonClass();
  Method met = cl.getMethod("retrieveResult", String); //String because result is of type String: you can use result.getClass() instead
  met.invoke(cl.cast(ServiceToActivity.getSingleton()), result); // compare it to this ServiceToActivity.getSingleton().retrieveResult(result);
} catch (JSONException e) {
  e.printStackTrace();
}
}

关于java - 从一个 Activity 启动 AsyncTask,在另一个 Activity 中获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30608050/

相关文章:

java - 视网膜兼容 JLabel 图像

java - 使用拆分方法从单个字符串中提取字段名称

android - 在 NavDirections 中找不到 safeargs 参数

Android Studio 引发此错误 : 'The emulator process for AVD was killed.'

android - AsyncTask 和泛型

java - Gradle Spring Boot依赖关系:包含为bootRun/排除为bootJar

java - 需要用Android Studio删除缓存

Android 应用程序未成功构建,获取 "sync failed"

java - 实现异步任务: An error occured while executing doInBackground() throws Runtime exception

Android 应用程序越来越慢