Android Debug Bridge套接字的问题:IOException

时间:2016-04-14 05:05:10

标签: java android adb ioexception localsocket

问题

大家好,我遇到过ADB或Android Studio或两者都有问题的问题。

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

我继续尝试'停止'应用程序,此时android工作室冻结了。通过运行一系列命令(我后来发现)或者只是在任务管理器中关闭adb.exe,android studio恢复了操作,但当然与设备断开连接。然而,我的设备必须完全重启,因为整个系统似乎陷入了一些问题,并且通常需要10倍的时间来打开另一个应用程序。

测试

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

  1. 我的logcat会反复打印约30次或以上
  2. 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 TCP ports
    2. 代码

      我不确定导致此问题的原因,但我会删除我正在调用的活动的代码,以及下面的调用方法。

      在主要活动中调用功能

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

      IndexActivity.java(要调用的活动)

      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()之前的所有方法都运行得很好。然而,在不同的活动中添加它以及其他一些方法后,它从未起作用。

      最后的想法

      1. 这是与我的代码相关的问题,还是我的adb或android studio的问题?
      2. 问题可能是由于在这个特定方法中没有调用的另一个类中的某些错误引起的吗?
      3. 任何导致可能解决方案的想法都会受到高度赞赏,因为我的开发和测试能力大大降低,因为我必须重新启动测试设备9次。

1 个答案:

答案 0 :(得分:0)

所以最后我发现了一个修复,并且可能是为什么会出现这个错误的原因。

方法

我开始在我的课程中禁用任何其他代码。我将其保留为默认onCreate等。我还在主屏幕活动中禁用了额外内容的传递。我还有一些findViewByID()变量赋值,它们有几个组件的多个实现。我修了几个,但不是全部。

现在这是我认为实际修复它的步骤。我有一个类,它从包含的xml文件中读取数据,并将数据添加到某个对象ArrayList的{​​{1}}。现在因为Song文件包含了相当多的记录,我已经插入了一种模板:

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出现某种问题。

解决方案

现在我所做的只是简单地注释掉Song标签中的空<song>,重新启用以前工作过的方法,瞧,没问题!

xml

我真的不确定它究竟是如何工作的,我对这个问题有一些指导意见,但也许得到空值的数据字段会出现空值或最终导致这种情况发生的事情。问题发生了。无论如何,危机终于避免了!

值得注意的是<songs> <!--<song> <number></number> <title></title> <verse></verse> <chorus></chorus> </song> <song> <number></number> <title></title> <verse></verse> <chorus></chorus> </song>--> </songs> 也是可以包含的。