我对 Android 和 Java 还很陌生,就此而言,如果我的问题的答案很简单,我深表歉意。
问题是,一旦选择了某个菜单项,我需要运行一个相当长(2-3秒)的任务(涉及HTTP请求,据我所知,我需要在不同的菜单项上执行所述操作)线程(而不是主线程),然后显示从 AsyncTask 获取的部分结果。
一切工作正常,除了菜单在执行 AsyncTask 的整个过程中保持打开状态之外:我找不到避免这种情况的方法。
我尝试用一个更短但相当相似的示例来总结我的问题
这是MainActivity代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(Menu.NONE,1,Menu.NONE,"Text");
return true;
}
@Override
public boolean onOptionsItemSelected (MenuItem mi) {
try {
String a = new AsyncTest ().execute().get();
Toast.makeText(MainActivity.this,a, Toast.LENGTH_SHORT).show();
return true;
}
catch (Exception e) {
return false;
}
}
}
这是 AsyncTask 公共(public)类 AsyncTest 扩展 AsyncTask{
@Override
protected String doInBackground(Void... params) {
long i;
for (i=0;i<100000000;i++);
return "Lol";
}
}
我尝试在 onOptionsItemSelected 之后使用 closeOptionsMenu();
,以便在执行 AsyncTask 之前关闭菜单,但它不起作用。
我在谷歌上没有找到太多关于这个主题的信息。
最佳答案
get() 被阻塞。所以基本上你是在另一个线程上完成工作,但你实际上是在等待主 UI 线程,防止菜单关闭。
试试这个:
@Override
public boolean onOptionsItemSelected (MenuItem mi) {
new AsyncTest () {
public void onPostExecute(String result) {
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
}
}.execute();
return true;
}
关于java - 运行 AsyncTask 时选项菜单保持打开状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20670094/