0

我有一个ListActivity. 每次启动时,AsyncTask都会运行以扫描我的 IP 地址并将结果显示在ListActivity. 一切正常。但是,如果我创建一个选项菜单(android 2.3),那么我的 IP 地址不会显示在ListActivity. 当AsyncTask我单击菜单按钮时,仍然可以正常工作并且选项菜单正确显示。没有错误发生,ListActivity只是不显示IP。这是我的代码:

public class MyIP extends ListActivity
{
    ArrayList <Device> devicesList = new ArrayList<Device>();
    AdapterListDevices adapter;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ListView listView = (ListView) findViewById(android.R.id.list);

        registerForContextMenu(listView);

        adapter = new AdapterListDevices(MyIP.this, R.layout.row_list_devices, devicesList);
        setListAdapter(adapter);

        scanMyDevice();
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo)
    {
      // Some code 
    }

    @Override
    public boolean onContextItemSelected(MenuItem item)
    {
             // Some code
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.myip_options_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
       // Some code
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        // Some code
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id)
    {
           // Some code
    }

    public void updateListAdapter(Device myDevice)
    {
        devicesList.add(myDevice);
        adapter.notifyDataSetChanged();
    }

    public void scanMyDevice()
    {
        ScanMyDeviceTask smd = new ScanMyDeviceTask(MyIP.this);
        smd.execute();
    }
}

这是我的 ScanMyDeviceTask:

 public class ScanMyDeviceTask extends AsyncTask <Void, Void, Void>
{
Context context;
ProgressDialog progDialog;
Device myDevice;
InetAddress myAddress;

public ScanMyDeviceTask(Context context)
{
    this.context = context;
    progDialog = new ProgressDialog(context);
}

@Override
protected void onPreExecute()
{
    progDialog.setTitle("Searching...");
    progDialog.setProgressStyle(progDialog.STYLE_SPINNER);
    progDialog.show();  
}

@Override
protected Void doInBackground(Void... params)
{
           //Scan the ip address here
    }

@Override
protected void onPostExecute(Void params)
{

    MyIP act = (MyIP) context;
    act.updateListAdapter(myDevice);

    PublicData pd = (PublicData) act.getApplication();
    pd.setMyIp(myAddress.getAddress());

    progDialog.dismiss();

}

}

4

3 回答 3

0

经过几天一次又一次地测试我的源代码,我确定我的源代码是正确的。现在我发现了问题。为了在 ListActivity 中显示项目,我使用了一个名为 AdapterListDevices 的自定义 ArrayAdapter(在单独的文件中)。你知道,当我在 ListActivity 中添加选项菜单代码时,它没有显示任何内容。然后我使用了这个技巧:

  • 对 AdapterListDevices 代码进行一些更改。(例如:在任何地方输入“blah”)
  • 编译项目。(当然失败了,但并不重要)
  • 更正 AdapterListDevices 代码。
  • 编译项目。
  • 一切正常,ListActivity 显示项目。

所以,我的问题解决了。但是我有一个愚蠢的问题:如果我更改一个文件中的源代码,为什么我的应用程序会出错?我不使用 Eclipse,我使用记事本并在命令提示符中使用 ant 进行编译。我也不用模拟器,我在真机上安装apk文件。新编译的应用程序安装在旧编译的应用程序上。

于 2013-12-14T17:08:27.893 回答
0

try-catch在您的代码周围放置一个块,scanMyDevice()如下所示:

try {
    ScanMyDeviceTask smd = new ScanMyDeviceTask(MyIP.this);
    smd.execute();
}
catch(Throwable t) {
    Log.e("scanMyDevice", e.toString());
}

如果您的活动中引发异常,则AsyncTask可能不会崩溃。然后你会看到你描述的行为——一切似乎都正常工作。

因此,添加上面的代码将帮助您查看那里是否发生了异常。

于 2013-12-09T20:56:49.400 回答
0

由于菜单资源是一个文件,我认为它需要使用全小写的文件名。

    inflater.inflate(R.menu.MyIP_options_menu, menu);

更改文件名以使用全部小写( myip_options_menu.xml ),然后在您的通胀参数中使用 R.menu.myip_options_menu 。

于 2013-12-09T21:25:45.577 回答