Android 调试桥套接字的问题:IOException

Problems with Android Debug Bridge sockets: IOException

问题

大家好,我在使用 ADB 或 Android Studio 或两者时遇到了一个非常有问题的 issue/bug。

所以我的 android phone 通过 USB 连接并启用了 USB 调试来测试我的应用程序。我添加了一些功能并想测试它们(两个有问题的活动),所以我继续 运行 它。单击导航图标开始新的 activity 后,屏幕变暗了一点,大约 30 秒后,整个屏幕变成白色,除了顶部的原生 android 下拉菜单仍然可见.

我继续尝试 'Stop' 该应用程序,此时 android 工作室冻结了。通过 运行 一系列命令(正如我后来发现的那样)或在任务管理器中简单地关闭 adb.exe,android studio 恢复了操作,但当然与设备断开了连接。但是,我的设备必须完全重启,因为似乎整个系统都因某些问题而陷入困境,打开另一个应用程序所需的时间是平时的 10 倍。

测试

重新测试后我注意到了一些事情

  1. 我的 logcat 会一遍又一遍地打印大约 30 次或更多次

Could not find class 'android.util.ArrayMap', referenced from method com.android.tools.fd.runtime.MonkeyPatcher.monkeyPatchExistingResources

Could not find class 'android.util.ArrayMap', referenced from method com.android.tools.fd.runtime.MonkeyPatcher.pruneResourceCache

IO Error creating local socket at church.rmhymnal

java.io.IOException: Address already in use

at android.net.LocalSocketImpl.bindLocal(Native Method)

at ........

  1. 在命令提示符中 运行 命令 netstat -o -n -a | findstr 5037 后,我会看到大量 TCP 端口列表,这些端口已被应用运行 反复打开。 (其中一些 TIME_WAIT 最终会被标记为 ESTABLISHED

代码

我不确定是什么导致了这个问题,但我会删除我正在调用的 activity 的代码,以及下面的调用方法。

在Main中调用函数Activity

 Intent intent = new Intent(HomescreenActivity.this, IndexActivity.class);
 Parcelable wrapped = Parcels.wrap(songs);
 intent.putExtra("songs", wrapped);
 startActivity(intent);

IndexActivity.java(Activity被调用)

public class IndexActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

    DrawerLayout drawer;
    LinearLayout ll;
    NavigationView navigationView;
    ArrayList<Song> songs;
    int index;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_index);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        navigationView = (NavigationView) findViewById(R.id.nav_view_index);
        if (navigationView != null) {
            navigationView.setNavigationItemSelectedListener(this);
            navigationView.setCheckedItem(R.id.nav_index);
        }

        Intent intent = getIntent();
        songs = Parcels.unwrap(intent.getParcelableExtra("songs"));
        ll = (LinearLayout) findViewById(R.id.indexButtonView);
        index = 0;
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        listIndex();
    }

    @Override
    public void onBackPressed() {
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.index, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_home) {
            super.finish();
        } else if (id == R.id.nav_hymns) {
            Intent intent =  new Intent(IndexActivity.this, SongDisplayActivity.class);
            Parcelable wrapped = Parcels.wrap(songs);
            intent.putExtra("songs", wrapped);
            intent.putExtra("index", index);
            startActivity(intent);
        } else if (id == R.id.nav_index) {
            //Do nothing
        } else if (id == R.id.nav_settings) {
            Intent intent = new Intent(IndexActivity.this, SettingsActivity.class);
            startActivity(intent);
        } else if (id == R.id.nav_about) {
            //Unimplemented
        }

        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    public void listIndex() {
        for (int i = 0; i < songs.size(); ++i)
        {
            if (!songs.get(i).getTitle().equals("")) {
                final Button songButton = new Button(this);
                songButton.setText(String.format("%s - %s", songs.get(i).getNumber(), songs.get(i).getTitle()));
                songButton.setBackgroundResource(R.drawable.buttonshadowbg);
                songButton.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
                songButton.setOnClickListener(new Button.OnClickListener() {
                    public void onClick(View v) {
                        index = songButton.getText().charAt(0);
                        Intent intent =  new Intent(IndexActivity.this, SongDisplayActivity.class);
                        Parcelable wrapped = Parcels.wrap(songs);
                        intent.putExtra("songs", wrapped);
                        intent.putExtra("index", index);
                        startActivity(intent);
                    }
                });
                songButton.setGravity(Gravity.CENTER_HORIZONTAL);
                ll.addView(songButton);
            }
        }
    }
}

澄清

我创建 listIndex() 之前的所有方法都运行良好。然而,在另一个 activity 中添加它以及其他一些方法后,它就再也没有用过。

最后的想法

  1. 这是我的代码问题还是我的 adb 或 android studio 的问题?
  2. 这个问题可能是由另一个 class 中的某个错误引起的,而这个特定方法没有调用这个方法吗?

任何导致可能解决方案的想法都将受到高度赞赏,因为我的开发和测试能力大大降低,因为我必须重新启动测试设备 10 次中有 9 次。

所以我终于找到了一个修复方法和一个可能的原因来解释为什么会出现这个错误。

方法

我首先在 classes 中禁用任何附加代码。我将其保留为默认值 onCreate 等。我还在我的 主屏幕 Activity 中禁用了附加功能的传递。我还有一些 findViewByID() 变量赋值,其中一些组件有多个实现。我修复了一些但不是全部。

下面是我认为真正解决问题的步骤。我有一个 class,它从包含的 xml 文件中读取数据并将数据添加到某个对象 SongArrayList。现在因为 xml 文件包含相当多的记录,所以我插入了一种模板来遵循:

<songs>
    <song>
        <number></number>
        <title></title>
        <verse></verse>
        <chorus></chorus>
    </song>
    <song>
        <number></number>
        <title></title>
        <verse></verse>
        <chorus></chorus>
    </song>
    <!-- etc -->
</songs>

现在按照上面 xml 文件的布局,我在那里有很多空标签需要在以后填写(一次把它们都填进去很费时间)。我不是专家,但似乎所有空标签都以某种方式导致 ArrayList 或 class Song 出现某种问题。

解决方案

现在我所做的只是简单地注释掉 xml 标签中的空 <song>,重新启用之前有效的方法,瞧,没有问题!

<songs>
    <!--<song>
        <number></number>
        <title></title>
        <verse></verse>
        <chorus></chorus>
    </song>
    <song>
        <number></number>
        <title></title>
        <verse></verse>
        <chorus></chorus>
    </song>-->
</songs>

我真的不确定它到底是如何工作的,我希望能就这个问题提供某种指导,但也许是空值的数据字段出现为 null 或最终导致此问题的原因会发生什么样的问题。总之,危机总算解除了!

值得注意的是Song也是可解析的