我试图通过从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,所以看起来我必须找到不同的机制来从我的远程服务中返回数据。 –