【问题标题】:define onPostExecute when new Asynctask is called在调用新的 Asynctask 时定义 onPostExecute
【发布时间】:2013-02-28 04:45:39
【问题描述】:

我创建了一个扩展Asynctask 的类。此类从多个活动中调用。它从网页中获取一些数据。之后,根据 url,在onPostExecute 方法中处理数据。现在我使用多个else if 语句,但它有点不方便。

有没有办法在创建新Asynctask的Activity中定义onPostExecute方法。

我认为它可能适用于接口或抽象方法,但不确定也不知道如何。

【问题讨论】:

    标签: java android interface abstract-class


    【解决方案1】:

    您为 AsyncTask 注册了一个事件侦听器,它将在 onPostExecute 运行时调用。

    public class Example extends AsyncTask<Void, Void, Void> {
    
      public interface ExampleListener {
        public void onStart();
        public void onProgress();
        public void onFinish();
      }
    
      private ExampleListener listener;
    
      public Example(ExampleListener listener) {
        mListener = listener;
      }
    
      @Override
      public void onPreExecute() {
        ...
        mListener.onStart();
        ...
      }
    
      @Override
      public void onProgressUpdate(Void... v) {
        ...
        mListener.onProgress();
        ...
      }
    
      @Override
      public void onPostExecute(Void result) {
        ...
        mListener.onFinish();
        ...
      }
    }
    

    自定义图案以适合您需要的任何设计。包括侦听器对每个事件所需的接口方法的任何参数。如果你有一个实现Example.ExampleListener 的类,那么你只需要调用new Example(this).execute() 来启动它。

    【讨论】:

    • 我试过了,但是当 listener.onFinish() 被调用时得到一个空指针异常。但我在构造函数中初始化了监听器
    • 您是在方法onFinish() 或调用onFinish() 时收到nullPointerException 吗?
    • 当我调用 onFinish() 时。似乎监听器等于 null
    【解决方案2】:

    您无需任何额外工作即可完成。

    public class MyTask extends AsyncTask<Void, Void, Void>
    {
    
        @Override
        protected Void doInBackground(Void... params)
        {
            // do some work
            return null;
        }
    
    }
    

    在活动中:

    MyTask t = new MyTask()
        {
            @Override
            protected void onPostExecute(Void result)
            {
                super.onPostExecute(result);
                // do some work             
            }
        };
    

    【讨论】:

      【解决方案3】:

      另一种方式,更 java/generic,可以帮助改进您的代码是使用Strategy 模式。 简而言之,对于每个不同的数据处理,您将创建一个实现相同接口的不同类。这样,添加新的“策略”就需要新的类,这样你的代码才会清晰。
      示例:

       public void onPostExecute(String result){
      ResponParser responseParser;
      
      if (result.equals("http://..1"));
      responseParser = new ResponParser1();
      else if (result.equals("http://..2"));
      responseParser = new ResponParser1();
      
      responseParser.parse();
      }
      

      其中 ResponParser 是由 ResponParser1 和 ResponParser1 实现的接口,它们是具体的类。

      【讨论】:

        【解决方案4】:

        使用接口是最好的选择,但为简单起见,您还可以将 Runnable 传递给 AsyncTask,您可以在 onPostExecute() 方法中执行它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-07
          • 1970-01-01
          • 1970-01-01
          • 2015-03-31
          相关资源
          最近更新 更多