我有弯针的问题。我称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/

10-10 02:08