【问题标题】:Running AysncTask again, once it finished up - onPostExecute()再次运行 AysncTask,一旦它完成 - onPostExecute()
【发布时间】:2013-03-07 15:32:35
【问题描述】:

我想通过名为 LOAD MORE 的按钮在循环触发器中一次又一次地运行名为 loadMore 的 AsyncTask。

错误:

03-07 20:31:38.330: E/AndroidRuntime(504): java.lang.IllegalStateException: 无法执行任务:任务已经执行(一个任务只能执行一次

试过

  • 按钮 LOADMORE 仅在 loadMore 的 onPostExecute() 时可见 - AsyncTask 已执行。在onPostExecute() 中添加 LOADMORE 视图。
  • AsyncTask 的假定行为未通过 LOADMORE 按钮出现。
  • 检查 AysncTask - loadMore RUNNING 与否?在 LOADMORE 按钮的 onClickListener 内。
  • 但作为日志信息,它永远不会到达 LOADMORE 按钮的onClickListener

LOADMORE按钮的onClickListener代码::

 ld. . . . . .loadMore AsyncTask.
 ll. . . . . . LinearLayout (where I'm removing and Adding LOADMORE button).
 loadMore. . . LOADMORE Button.

public void onClick(View v) {
        // TODO Auto-generated method stub
        ll.removeView(loadMore);
        //loadMore.setVisibility(View.INVISIBLE);
        spin2.setVisibility(View.VISIBLE);
        if(ld.getStatus()==Status.PENDING)
        {
            ld.execute();
            Log.i("PENDING", "Not yet RUNNING");
        }
        else if(true)
        {
            while(ld.getStatus()==Status.RUNNING)
            {
                Log.i("loadMore Async", "LoadMore RUNNING");
                if(ld.getStatus()==Status.FINISHED)
                    return;
            }
            ld.execute();
        }

    }

loadMore AsyncTask 的 onPostExecute() ::

protected void onPostExecute(Void result) {
adapter = new PhotosAdapter(MainActivity.this, arrPhotos);
        gridOfPhotos.setAdapter(adapter);

        spin2.setVisibility(View.GONE);

        ll.addView(loadMore);
        Log.i("loadMore-Async", "Adding LoadMore button again");
        Log.i("loadMore-Async", "LoadMore AsyncTask onPost() finished");
        loadMore.setOnClickListener(n);
        Log.i("loadMore-Async", "Adding Listener to LoadMore");
    }

【问题讨论】:

  • 创建一个新的 AsyncTask ?
  • 为什么不创建服务??
  • @njzk2 创建一个新的 loadMore AsyncTask 意味着我需要再次创建它的 z 对象??
  • @Payal 我已经用 AsyncTask 做了很多工作,所以现在切换到Service不是一个好选择。
  • @VikalpPatel 为您的 asynctask 创建新实例并调用 exec() 方法

标签: android multithreading android-asynctask


【解决方案1】:

您不能两次执行 AsyncTask。引用文档“任务只能执行一次(如果尝试第二次执行将引发异常。)”,链接http://developer.android.com/reference/android/os/AsyncTask.html

除了创建一个新任务并执行它之外别无选择。

【讨论】:

  • 感谢您的回复。但是 OP 已经说明了这一点,我正在寻找一种方法来解决它。
【解决方案2】:

通过

  • 创建一个可以动态实例化的新 AsyncTask。
  • 循环创建新的 AysncTask 是通过创建我的 loadMore AsyncTask 的数组来解决的。

代码::

loadMorePhotos[] lmd=new loadMorePhotos[1000];

LOADMORE按钮的onClickListener::

    View.OnClickListener n=new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        ll.removeView(loadMore);
        //loadMore.setVisibility(View.INVISIBLE);
        spin2.setVisibility(View.VISIBLE);
        if(ld.getStatus()==Status.PENDING)
        {
            ld.execute();
            Log.i("loadMoreAsync", "new AsyncTask : 0");
            Log.i("PENDING", "Not yet RUNNING");
        }
        else if(true)
        {
             Log.i("loadMoreAsync", "Creating new AsyncTask");
             lmd[j]=new loadMorePhotos();
             lmd[j].execute();
             Log.i("loadMoreAsync", "Creating LoadMore AsyncTask :"+j);
             j++;

        }

    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2019-03-24
    • 2022-09-27
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    相关资源
    最近更新 更多