我有弯针的问题。我称looper.prepare()
,并在做完所有事情后一切正常。但是,如果我旋转设备,则准备过程会出现异常。
07-12 16:40:09.760: E/activity(15809): java.lang.RuntimeException: Only one Looper may be created per thread
我正在尝试退出弯针,但是它什么也没做。
这是我的AsyncTask:
@Override
protected String doInBackground(String... args) {
try{Looper.prepare(); //here start the exception
try {
URL url = new URL(link);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
utente.measure(0, 0);
bmImg = decodeSampledBitmapFromResource(is,(int) utente.getMeasuredWidth(), utente.getMeasuredHeight(), link);
if(bmImg!=null){
try{
getCroppedBitmap();
}catch(Exception e){
System.out.println(e);
}
}
}
catch (IOException e)
{
Log.e("lele", "errore qui");
e.printStackTrace();
}
Looper.myLooper().quit(); //do nothings
}catch(Exception e){
Log.e("canta tu", " "+e);
}
Looper.myLooper().quit(); //do nothings
return null;
}
@Override
protected void onPostExecute(String args) {
//Looper.myLooper().quit(); //generathed an error, main thread can't stop looper
if(bmImg!=null){
try{
utente.setImageBitmap(bmImg);
ellisse.setVisibility(View.VISIBLE);
}catch(Exception e){
Log.e("lele",""+e);
Log.e("lele","errore probabile out of bound");
}
}
else {
Toast.makeText(getApplicationContext(), "Modifica la foto da \"profilo\"", Toast.LENGTH_LONG).show();
}
有想法吗?
最佳答案
有两种情况需要考虑:
(1)您想在应用程序的整个生命周期中都使用的循环程序线程,并且不持有对 View 的强烈引用(即使不是隐式的)
Quoting Google工程师克里斯托弗·泰特(Christopher Tate)-您可以将弯针放在那里,直到您的应用被销毁为止,然后它就会随之消失。您无需担心。
我将这样的循环程序线程用作多用途HandlerThread,并在需要在主线程(UI)之外运行的任何时候将Runnables发送给它。
(2)引用 View 的弯针线程
这不符合Christopher Tate的建议,因为它会导致内存泄漏,例如,如果旋转屏幕。
(最好将处理程序线程设为静态并使用弱引用-然后会返回选项1)
要杀死它,您必须退出循环。为此,您需要在该线程的上下文上运行quit命令。
因此,请使用msg.what等任何int形式创建一条消息,并在handleMessage中等待该int以及何时到达-调用:
Looper myLooper = Looper.myLooper();
if (myLooper!=null) {
myLooper.quit();
}
并且不要忘记使所有对 View 和 Activity 的引用为空。
从您的 Activity
onDestroy()
发送此终止消息给处理程序关于android - 在哪里用弯针 "quit"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17617731/