我有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();
}
}
答案 0 :(得分:0)
在try-catch
中围绕代码放置一个scanMyDevice()
块,如下所示:
try {
ScanMyDeviceTask smd = new ScanMyDeviceTask(MyIP.this);
smd.execute();
}
catch(Throwable t) {
Log.e("scanMyDevice", e.toString());
}
如果AsyncTask
中出现异常,您的活动可能不会崩溃。然后你会看到你描述的行为 - 一切似乎都正常工作。
因此,添加上述代码可以帮助您查看是否存在异常。
答案 1 :(得分:0)
由于菜单资源是一个文件,我认为它需要使用全部小写的文件名。
inflater.inflate(R.menu.MyIP_options_menu, menu);
更改文件名以使用全部小写(myip_options_menu.xml),然后在通货膨胀arg中使用R.menu.myip_options_menu。
答案 2 :(得分:0)
经过几天一次又一次地测试我的源代码,我确信我的源代码是正确的。现在我发现了问题。要在ListActivity中显示项目,我使用名为AdapterListDevices的自定义ArrayAdapter(在单独的文件中)。你知道,当我在ListActivity中添加选项菜单代码时,它没有显示任何内容。然后我用了这个技巧:
所以,我的问题解决了。但我有一个愚蠢的问题:如果我在一个文件中更改源代码,为什么我的应用程序出错?我不使用Eclipse,我使用记事本并在命令提示符下使用ant编译。我也不使用模拟器,我在真正的手机中安装apk文件。新编译的应用程序安装在旧的已编译应用程序上。