android - 当我重复执行 OnListItemClick 时,为什么在 Android 上会出现 StackOverflowError?

标签 android stack-overflow

我有一个 ListView 。单击 ListView 时会调用一个 Intent 。但是当我重复执行 OnListItemClick 时,会抛出 StackOverflowError

我的代码是:

protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);

    Cursor cursor = (Cursor) lAdapter.getItem(position);
    final String lpn = cursor.getString(cursor
        .getColumnIndex(SQLHelper.EMPLOYEE_LPN));
    System.out.println("EMPLOYEE_LPN :   " + lpn);
    final Context con = this;

    final ProgressDialog empDialog = ProgressDialog.show(this, "", "Loading Employee Details ....");
    empDialog.setIcon(R.drawable.icon64);
    empDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    empDialog.show();

    Thread mBackground = new Thread() {

        @Override
        public void run() {


        try{
         // preparing a looper on current thread  the current thread is being detected implicitly     
                Looper.prepare(); 
                DirectoryApp appState = (DirectoryApp) getApplicationContext();
            Object[][] requestArray = new Object[][] {{"lpn",lpn}};
            SOAPHelper soapHelper = new SOAPHelper();
            String result = soapHelper.getHttpTransportResponse(
                appState.getNAMESPACE_DIRECTORY(), "",
                appState.getMETHOD_NAME_GET_EMPLOYEE_DETAILS(), appState.getURL_EYDIRECTORY_SERVICE(), requestArray);

            if(result.equals("")){
                Toast.makeText(ListContacts.this, getString(R.string.connErr),
                    Toast.LENGTH_LONG).show();
            }
            else{
                    Intent intentEmp = new Intent(con,
                    EmployeeDetails.class);
                intentEmp.putExtra("result",
                    result);
                startActivity(intentEmp);

            }
            empDialog.dismiss();
            handler.sendEmptyMessage(1);

        }
        catch (Exception e) {
            empDialog.dismiss();
            Bundle bundle = new Bundle();
            bundle.putInt("flag", 0);
            Message message = new Message();
            message.setData(bundle);
            handler.sendMessage(message);
        }

        }

    };

    // start the background thread
    mBackground.start();
    Looper.loop();


    }


    private Handler handler = new Handler() {

    @Override
    public void handleMessage(Message msg) {

        super.handleMessage(msg);

        int flag = msg.getData().getInt("flag");
        switch (flag) {
        case 0:
            Toast.makeText(ListContacts.this, getString(R.string.connErr),
                Toast.LENGTH_LONG).show();
            break;
        case 1:
            break;
        default:
            Toast.makeText(ListContacts.this, getString(R.string.connErr),
                Toast.LENGTH_LONG).show();
        }

    }
};

异常(exception)情况是:

07-27 12:39:38.566: ERROR/AndroidRuntime(6694): FATAL EXCEPTION: main
07-27 12:39:38.566: ERROR/AndroidRuntime(6694): java.lang.StackOverflowError
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.View.draw(View.java:6739)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.drawChild(ViewGroup.java:1648)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.widget.AbsListView.dispatchDraw(AbsListView.java:1365)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.widget.ListView.dispatchDraw(ListView.java:3046)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.View.draw(View.java:6845)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.widget.AbsListView.draw(AbsListView.java:2257)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.drawChild(ViewGroup.java:1648)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.View.draw(View.java:6742)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.drawChild(ViewGroup.java:1648)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.View.draw(View.java:6742)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.drawChild(ViewGroup.java:1648)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.View.draw(View.java:6742)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.drawChild(ViewGroup.java:1648)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.View.draw(View.java:6742)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1872)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewRoot.draw(ViewRoot.java:1449)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1194)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1771)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.os.Looper.loop(Looper.java:144)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at org.sipdroid.sipua.ui.ListContacts.onListItemClick(ListContacts.java:381)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.app.ListActivity$2.onItemClick(ListActivity.java:345)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.widget.AdapterView.performItemClick(AdapterView.java:284)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.widget.ListView.performItemClick(ListView.java:3382)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.os.Handler.handleCallback(Handler.java:587)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.os.Looper.loop(Looper.java:144)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at org.sipdroid.sipua.ui.ListContacts.onListItemClick(ListContacts.java:381)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.app.ListActivity$2.onItemClick(ListActivity.java:345)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.widget.AdapterView.performItemClick(AdapterView.java:284)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.widget.ListView.performItemClick(ListView.java:3382)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.os.Handler.handleCallback(Handler.java:587)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.os.Looper.loop(Looper.java:144)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at org.sipdroid.sipua.ui.ListContacts.onListItemClick(ListContacts.java:381)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.app.ListActivity$2.onItemClick(ListActivity.java:345)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.widget.AdapterView.performItemClick(AdapterView.java:284)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.widget.ListView.performItemClick(ListView.java:3382)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.os.Handler.handleCallback(Handler.java:587)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at android.os.Looper.loop(Looper.java:144)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at org.sipdroid.sipua.ui.ListContacts.onListItemClick(ListContacts.java:381)
07-27 12:39:38.566: ERROR/AndroidRuntime(6694):     at

最佳答案

我认为您的 Looper.loop() 调用在错误的线程中运行 - 它在 onListItemClick() 方法中,因此它在 '前景'线程。因此 onListItemClick() 永远不会返回,后续调用它只会建立堆栈。

我认为它应该在mBackground 线程的run() 方法中,就在catch 子句之前。

此外,我对 Looper 的使用了解不多,但我看不出你应该在哪里退出 Looper

关于android - 当我重复执行 OnListItemClick 时,为什么在 Android 上会出现 StackOverflowError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6840701/

相关文章:

android - fragment 无法施放

java - Android 更改 OpenGL 坐标系

java - 转换为父类(super class)时出现 StackOverflow 错误

java - Quicksort (Java) 在 array.length > 60k 处导致 StackOverFlow

c++ - 对称传输不会阻止 C++20 协程的堆栈溢出

Android UI - 如何使与 TextView 重叠的 View 分隔线可见?

android - 我无法更改操作栏中字幕的颜色

php - 如何在php json编码后删除隐藏的垃圾字符

c - 防止用户可编程计算器中的堆栈溢出/无限递归

c - 为什么我在 C 中的递归函数会导致堆栈溢出?