gpt4 book ai didi

android - looper 到 "quit"哪里?

转载 作者:太空宇宙 更新时间:2023-11-03 11:28:28 24 4
gpt4 key购买 nike

我的循环器有问题。我调用了 looper.prepare(),在做了一些事情后一切正常。但是,如果我旋转设备,我会在准备时遇到异常。

07-12 16:40:09.760: E/activity(15809):  java.lang.RuntimeException: Only one Looper may be created per thread

我正在尝试退出循环程序,但它什么也没做。

这是我的异步任务:

 @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 - 你可以将循环程序留在那里,直到你的应用程序被销毁,它会随之崩溃。您无需担心。

"Speaking very generally, never quit() your looper threads. That method exists mostly for historical and testing reasons. In Real Life™, I recommend that you continue to reuse the same looper thread(s) for the life of the process rather than creating/quitting them."

我将这样的活套线用作多用途HandlerThread ,并在我想要在主线程 (UI) 之外运行某些内容时将 Runnables 发送给它。

(2) 引用 View 的循环线程

这个不在 Christopher Tate 的推荐范围内,因为它会导致内存泄漏,例如,如果你旋转屏幕。
(您最好将处理程序线程设为静态并使用弱引用 - 您将返回选项 #1)
要杀死它,你必须退出循环。为此,您需要在该线程的上下文中运行退出命令。
因此,创建一条消息,其中包含一些 whatever int 作为你的 msg.what,并在你的 handleMessage 中等待这个 int,当它到达时 - 调用:

Looper myLooper = Looper.myLooper();
if (myLooper!=null) {
myLooper.quit();
}

并且不要忘记将所有对 View 和 Activity 的引用置为空。

从您的 Activity onDestroy()

将此终止消息发送到处理程序

关于android - looper 到 "quit"哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17617731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com