我对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 公共类AsyncTest扩展了AsyncTask {
@Override
protected String doInBackground(Void... params) {
long i;
for (i=0;i<100000000;i++);
return "Lol";
}
}
我尝试在onOptionsItemSelected之后使用closeOptionsMenu();
,以便在执行AsyncTask之前关闭菜单,但它不起作用。
我在google上的主题上找不到太多。
答案 0 :(得分:1)
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;
}