2013-12-18 88 views
0

我对Android和Java很有新意,对于这个问题,我很抱歉如果我的问题的答案很简单。选项菜单在运行时保持打开状态AsyncTask

问题是,一旦选择了某个菜单项,我需要运行一个相当长(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"; 
    } 
} 

我试过用closeOptionsMenu();在onOptionsItemSelected之后,为了关闭菜单之前的As yncTask被执行,但它不起作用。

我在google上没有发现太多的话题。

回答

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; 
    } 
相关问题