android线程自动回收,Android AsyncTask使用旧数据回收的线程

我试图通过从Activity调用的Asynctask访问REMOTE android服务。Android AsyncTask使用旧数据回收的线程

我有一个问题,我认为是线程被重用造成的。我在AsyncTask中使用了一个Lopper,当它得到一个线程时,它已经被一个早期的远程服务调用分配了,我得到一个关于每个线程只允许有一个循环的错误。我不认为这是因为我试图在错误的线程上访问UI。

我可以用一些非常简单的代码来模仿这个问题。我在一个活动上创建了一个按钮,只需按下它6次。希望有人可以告诉我如何解决这个问题。我试过检查活套不是空的,但是这只会导致我另一个问题,所以我想尝试解决这个问题。

这里是我的活动

public class MainActivity extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

public void buttonClick(View view)

{

MyAsychTask myAsychTask = new MyAsychTask() ;

myAsychTask.execute() ;

}}

的的AsyncTask

public class MyAsychTask extends AsyncTask{

@Override

protected Void doInBackground(Void... params) {

Log.wtf("Thead details", Thread.currentThread().getName() + " : " + Thread.currentThread().getState().toString() + " : Looper def: " + ((Looper.myLooper()==null) ? "none" : "looper")) ;

Looper.prepare();

Handler myHandler = new Handler() {

public void handleMessage(Message msg) {

// in real app process incoming messages here then quit looper

Log.wtf("executing message", " ") ;

this.getLooper().quit() ;

}

};

new simulateREMOTEservice(myHandler) ;

Looper.loop() ;

Log.wtf("exited looper", " ") ;

return null ;

}}

class simulateREMOTEservice{

public simulateREMOTEservice(Handler myHandler)

{

Log.wtf("simulating REMOTE service", " ") ;

myHandler.sendEmptyMessage(0) ;

}}

日志文件是

10-18 19:00:12.420: A/Thead details(3081): AsyncTask #1 : RUNNABLE : Looper def: none

10-18 19:00:12.420: A/simulating REMOTE service(3081):

10-18 19:00:12.420: A/executing message(3081):

10-18 19:00:12.420: A/exited looper(3081):

10-18 19:00:14.280: A/Thead details(3081): AsyncTask #2 : RUNNABLE : Looper def: none

10-18 19:00:14.290: A/simulating REMOTE service(3081):

10-18 19:00:14.290: A/executing message(3081):

10-18 19:00:14.300: A/exited looper(3081):

10-18 19:00:16.140: A/Thead details(3081): AsyncTask #3 : RUNNABLE : Looper def: none

10-18 19:00:16.150: A/simulating REMOTE service(3081):

10-18 19:00:16.150: A/executing message(3081):

10-18 19:00:16.150: A/exited looper(3081):

10-18 19:00:17.830: A/Thead details(3081): AsyncTask #4 : RUNNABLE : Looper def: none

10-18 19:00:17.840: A/simulating REMOTE service(3081):

10-18 19:00:17.840: A/executing message(3081):

10-18 19:00:17.840: A/exited looper(3081):

10-18 19:00:19.480: A/Thead details(3081): AsyncTask #5 : RUNNABLE : Looper def: none

10-18 19:00:19.480: A/simulating REMOTE service(3081):

10-18 19:00:19.490: A/executing message(3081):

10-18 19:00:19.490: A/exited looper(3081):

10-18 19:00:21.810: A/Thead details(3081): AsyncTask #1 : RUNNABLE : Looper def: looper

10-18 19:00:21.820: E/AndroidRuntime(3081): FATAL EXCEPTION: AsyncTask #1

10-18 19:00:21.820: E/AndroidRuntime(3081): java.lang.RuntimeException: An error occured while executing doInBackground()

10-18 19:00:21.820: E/AndroidRuntime(3081): at android.os.AsyncTask$3.done(AsyncTask.java:266)

10-18 19:00:21.820: E/AndroidRuntime(3081): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)

10-18 19:00:21.820: E/AndroidRuntime(3081): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)

10-18 19:00:21.820: E/AndroidRuntime(3081): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)

10-18 19:00:21.820: E/AndroidRuntime(3081): at java.util.concurrent.FutureTask.run(FutureTask.java:137)

10-18 19:00:21.820: E/AndroidRuntime(3081): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)

10-18 19:00:21.820: E/AndroidRuntime(3081): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574)

10-18 19:00:21.820: E/AndroidRuntime(3081): at java.lang.Thread.run(Thread.java:1020)

10-18 19:00:21.820: E/AndroidRuntime(3081): Caused by: java.lang.RuntimeException: Only one Looper may be created per thread

10-18 19:00:21.820: E/AndroidRuntime(3081): at android.os.Looper.prepare(Looper.java:76)

10-18 19:00:21.820: E/AndroidRuntime(3081): at com.example.testlooper.MyAsychTask.doInBackground(MyAsychTask.java:15)

10-18 19:00:21.820: E/AndroidRuntime(3081): at com.example.testlooper.MyAsychTask.doInBackground(MyAsychTask.java:1)

10-18 19:00:21.820: E/AndroidRuntime(3081): at android.os.AsyncTask$2.call(AsyncTask.java:252)

10-18 19:00:21.820: E/AndroidRuntime(3081): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

10-18 19:00:21.820: E/AndroidRuntime(3081): ... 4 more

+0

显然我无法自己关闭它,但看起来我在遇到与以下链接中的注释16相同的问题http://code.google.com/p/android/issues/detail?id= 20915 基本上他们说你不应该在AsynchTask中使用Handler,所以看起来我必须找到不同的机制来从我的远程服务中返回数据。 –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值