2013-12-18 3 views
0

나는 안드로이드에 대해 다소 새로운 편이며, 자바에 관해서는, 문제에 대한 대답이 간단한 것이라면 사과드립니다.AsyncTask를 실행하는 동안 Options Menu가 열린 상태로 유지됨

문제는 특정 메뉴 항목을 선택하면 HTTP 요청과 관련된 다소 긴 (2-3 초) 작업을 실행해야하며, 해당 작업을 주 스레드와 다른 스레드)를 실행 한 다음 AsyncTask에서 가져온 결과의 일부를 표시합니다.

AsyncTask가 실행되는 전체 시간 동안 메뉴가 열리는 것을 제외하면 모든 것이 정상적으로 작동합니다.이 문제를 피할 방법을 찾을 수 없습니다.

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를 확장입니다 :

나는 짧은 아니라 유사한 예를

여기에 MainActivity 코드의 내 문제를 요약하려

@Override 
    protected String doInBackground(Void... params) { 
     long i; 
     for (i=0;i<100000000;i++); 
     return "Lol"; 
    } 
} 

나는 전에 을 사용해 보았습니다. onOptionsItemSelected 직후에 메뉴를 닫기 전에 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; 
    } 
관련 문제