首页>Program>source

这是我不确定如何解决的问题。 基本上,我有一个ASyncTask类,它在后台照常进行操作.完成后我想做点事.现在,在您继续说"只使用onPostExecute()"之前,有一个陷阱.我需要运行的方法在活动中,而不是在Task类中。

我看到的方式有两种选择。

A:
   CustomTask task = new CustomTask();
    task.execute(passedParams);
            //when(task.execute is finished)
            {
                doX();
            }

我希望我可以这样做,因为它是如此的简单,可以让我检查任务何时完成,而不必经常轮询活动和getStatus()。 我不认为我会很幸运,但是如果有人能做到这一点,那就太好了

B:

将活动作为参数传递给ASyncTask.这太乱了,我对使用它并不满意,但是从它和对象引用中可以看出来,我不知道它是否可以工作

   CustomTask task = new CustomTask();
    task.execute(passedParams,MyActivity);

然后在Tasks onPostExecute中,我可以将其称为MyActivity.doX();


C:

第三种方法是使asynctask在活动本身中成为私有类,但我真的很想将其分开.可重用性和其他方面–

对此有何想法?

总而言之,task.execute完成后需要doX().任何想法表示赞赏。


D:

好吧,我知道我在这里.我一直在思考新的解决方案.可以从任何地方调用的类方法或静态方法.

public class ProfileSettings extends Activity
{
      public static void doX()
      {
          //Logic...
      }
}

来自AsyncTask

MyActivity.doX();
最新回答
  • 10天前
    1 #

    选项B应该可以工作,有时是个不错的选择,但有时我为此使用匿名类.当您从活动中致电时:

    CustomTask task = new CustomTask() {
        @Override
        protected void onPostExecute(Long result) {
            super.onPostExecute(result);
            MyActivity.this.doX();
        }
    }.execute();
    

  • 10天前
    2 #

    Option A:

    Android API已经为此提供了内置函数AsyncTask.get():

    CustomTask task = new CustomTask();
    task.execute(passedParams);
    Result result = task.get(); // <- Block UI thread and waiting for AsyncTask finish.
    this.doX(result);
    

    如您所见,这是一个不好的做法,因为它阻塞了UI线程并可能导致ANR异常。这样做实际上是在牺牲AsyncTask的利益,并使其与UI线程同步运行。


    Option B and C

    通过调用onPostExecute()方法中的doX()方法,这都是正确的处理方式,

    AsyncTask顾名思义,它与UI线程异步运行后台线程,一旦后台线程完成,就在UI线程上调用onPostExecute方法.由于无法确定在项目构建时何时调用onPostExecute方法(即何时完成doInBackground方法),因为它是在应用程序运行时确定的,因此我们唯一知道的是保证onPostExecute方法在UI线程上被调用 换句话说,换句话说,在项目构建时编写代码时,我们永远无法确切知道doInBackground何时完成,并且代码执行会跳回onPostExecute方法之外的UI线程(除非您在诸如Option之类的代码中实现了一些等待机制 一个).所以onPostExecute方法的目的是在doInBackground方法完成后处理所有内容,这也是为什么onPostExecute方法的唯一参数是doInBackground方法返回的结果的原因。

    选项B和C之间的区别是将AsyncTask实现为内部类还是单独的类.这已经在CoDebug中提出并讨论了很多次.大多数人认为出于可重用性等原因将它们分开是很好的。从我的观点来看,我不同意这一点. Java编程语言提供其内部类语法以适合某些特殊编码情况的原因是,从OOP角度讨论代码重构时,应从问题抽象级别考虑更多,而不仅仅是在代码级别将内部类与Activity类剥离.如您在示例中所见,通过将AsyncTask与Activity隔离,您不会获得任何真正的好处,而是增加了代码复杂度(需要在类之间传递活动上下文引用)来解决问题。

    我认为您真正的问题是,我们是否应该将AsyncTask内部类实现与Activity隔离.为了获得更好的OOP代码重构(可重用性,可测试性等),请查看我在CoDebug问题中的答案,以了解如何将业务层与应用程序UI层正确隔离。

  • 10天前
    3 #

    我能够实现此功能 界面:

    http://howcanisolve.com/38646/android-java-equivalent-of-ios-block-callbacks

    public interface ICallbacks { 
    public void onResponse(JSONObject response);
    public void onError(VolleyError error);
    }
    

    然后在您的常规代码中放置一个新的Callbacks实例:

    public static void getPassagesForFirebaseUser(FirebaseUser user,
    Context context, ICallbacks events) { 
      //here code and call ICallbacks methods
      if(result){ events.onResponse(response); }
      if(error){ events.onError(err); }
    }
    

    最终您可以使用调用该方法:

    getPassagesForFirebaseUser(user, context, new ICallbacks(){
      @Override
      public void onResponse(JSONObject response){
          //Success !!!
      }
      @Override
      public void onError(VolleyError response){
          //Error !!!
      }
    });
    

  • 10天前
    4 #

    选项B通常更安全.但是即使那样,您也需要小心.您需要存储您的 Activity实例 (不仅仅是班级)在 ASyncTask中 .如果是 Activity 在任务运行时被破坏(如果用户按下Back按钮会怎样?),您需要将此情况告知任务,这样任务就不会尝试对无效的 Activity调用方法

    如果 Activity 重新出现(例如,旋转屏幕后),则需要重新安装新的 Activity 到正在运行的任务。

    这些事情很奇怪。

  • jQuery Mobile:单击按钮时如何不显示按钮焦点光晕?
  • c:您如何安全地调用vsnprintf()?