2013-05-07 18 views
76

Próbuję przekonwertować działanie na fragment. Znak błędu na runOnUiThread. w przeszłości:runOnUiThread w fragmencie

GoogleActivityV2 rozciąga się od działalności. runOnUiThread w klasie ExecuteTask. klasa ExecuteTask zagnieżdżona w działaniu.

(Run ok) teraz:

GoogleActivityV2 rozciąga się od fragmentu. runOnUiThread w klasie ExecuteTask. klasa ExecuteTask zagnieżdżona w działaniu. (Błąd na runOnUiThread)

tutaj jest mój kod

public class GoogleActivityV2 extends SherlockMapFragment implements OnMapClickListener , OnMapLongClickListener , OnCameraChangeListener , TextWatcher { 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     View rootView = inflater.inflate(R.layout.activity_googlev2, container, false); 
     Init(); 
     adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_dropdown_item_1line); 
     textView = (AutoCompleteTextView) getView().findViewById(R.id.autoCompleteTextView1); 
     return rootView; 
    } 

    public void onCameraChange(CameraPosition arg0){ 
     // TODO Auto-generated method stub 
    } 

    public void onMapLongClick(LatLng arg0){ 
     llLoc = arg0; 
     stCommand = "onTouchEvent"; 
     lp = new ExecuteTask(); 
     lp.execute(); 
    } 

    public void onMapClick(LatLng arg0){ 
     // TODO Auto-generated method stub 
    } 

    class ExecuteTask extends AsyncTask<String, String, String> { 
     @Override 
     protected void onPreExecute(){ 
      super.onPreExecute(); 
      if(stCommand.compareTo("AutoCompleteTextView") != 0) { 
       pDialog = new ProgressDialog(getActivity()); 
       pDialog.setMessage(Html.fromHtml("<b>Search</b><br/>Loading ...")); 
       pDialog.setIndeterminate(false); 
       pDialog.setCancelable(false); 
       pDialog.show(); 
      } 
     } 

     protected String doInBackground(String ... args){ 
      do something 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String file_url){ 
      if(stCommand.compareTo("AutoCompleteTextView") != 0) pDialog.dismiss(); 
      runOnUiThread(new Runnable() { 
       public void run(){ 
        do something 
       } 
      }); 
     } 
    } 
    public void afterTextChanged(Editable s){ 
     // TODO Auto-generated method stub 
    } 

    public void beforeTextChanged(CharSequence s, int start, int count, int after){ 
     // TODO Auto-generated method stub 
    } 

    public void onTextChanged(CharSequence s, int start, int before, int count){ 
     // TODO Auto-generated method stub 
    } 
} 

błąd mówi: Eclipse Error

jak można naprawić ten błąd?

+5

Kod, który piszę w witrynie onPostExecute, działa już w wątku głównym. Z drugiej strony nie musisz wywoływać runOnUiThread(). – rciovati

+0

@rciovati „zrobić coś” i obecnie onPostExecute różnią – Dolphin

+0

@Dolphin zagłosuję się to pytanie pomaga mi dużo .. –

Odpowiedz

187

Spróbuj tego: getActivity().runOnUiThread(new Runnable...

To dlatego, że:

1) ukrytą this w swoim powołaniu do runOnUiThread odnosi się do AsyncTask, nie swój fragment.

2) Fragment nie posiada runOnUiThread

(http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/app/Fragment.java?av=f)

jednak Activity robi:

(http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/app/Activity.java?av=f)

Należy pamiętać, że to właśnie wykonuje Runnable jeśli jesteś już na głównym wątku i używa Handler, jeśli nie jesteś w głównym wątku. Można zaimplementować Handler w swoim fragmencie, jeśli nie chcesz się martwić o kontekście this, to faktycznie bardzo proste:

http://developer.android.com/reference/android/os/Handler.html

EDIT: @rciovati ma rację, jesteś w onPostExecute, to już na głównym wątku.

+0

dzięki to pomoże mi lot..i głosować aż –

+0

Kilka razy getActivity(). RunOnUiThread jest prowadzące do NullPointerException . Czy możesz wytłumaczyć? – developer1011

+1

@ developer1011, które nastąpi, gdy fragment zostanie odłączony od działania. Jest to częste w przypadku zadań asynchronicznych, ponieważ działanie mogło zostać zniszczone podczas długotrwałej operacji, więc nie istnieje już "get". Zawsze sprawdzaj najpierw wartość zerową. – bclymer

Powiązane problemy