2013-05-07 16 views
76

Ich versuche, eine Aktivität in Fragment zu konvertieren. Die Fehlermarkierung ist runOnUiThread. in der Vergangenheit:runOnUiThread im Fragment

GoogleActivityV2 erstreckt sich von Activity. runOnUiThread in Klasse ExecuteTask. Klasse ExecuteTask geschachtelt für Aktivität.

(Run ok) jetzt:

GoogleActivityV2 erstreckt sich von Fragment. runOnUiThread in Klasse ExecuteTask. Klasse ExecuteTask geschachtelt für Aktivität. (Fehler auf runOnUiThread)

hier ist mein Code

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 
    } 
} 

der Fehler sagt: Eclipse Error

wie kann ich diesen Fehler beheben?

+5

Der Code, den Sie in onPostExecute schreiben, wird bereits im Hauptthread ausgeführt. Auf der anderen Seite müssen Sie runOnUiThread() nicht aufrufen. – rciovati

+0

@rciovati "tun etwas" rein und raus onPostExecute sind unterschiedlich – Dolphin

+0

@Dolphin ich vot up diese Frage hilft es mir viel .. –

Antwort

187

Versuchen Sie folgendes: getActivity().runOnUiThread(new Runnable...

Es ist, weil:

1) die impliziten this in Ihrem Aufruf zum runOnUiThread auf AsyncTask Bezug genommen wird, nicht Ihr Fragment.

2) Fragment nicht haben runOnUiThread

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

jedoch Activity tut:

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

Beachten Sie, dass dies führt nur die Runnable, wenn Sie bereits sind auf dem Hauptthread und verwendet eine Handler, wenn Sie nicht auf dem Hauptthread sind. Sie können eine Handler in Ihrem Fragment implementieren, wenn Sie wollen über den Kontext von this keine Sorge, es ist eigentlich sehr einfach:

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

EDIT: @rciovati richtig ist, Sie sind in onPostExecute, das ist schon auf dem Hauptthread.

+0

danke es mir helfen viel..i vote up –

+0

Manchmal mal getActivity(). RunOnUiThread ergibt sich in NullPointerException . Könntest du erklären? – developer1011

+1

@ developer1011 wird passieren, wenn das Fragment von der Aktivität getrennt wurde. Dies ist bei asynchronen Tasks üblich, da die Aktivität während des Langzeitbetriebs zerstört worden sein könnte. Überprüfen Sie immer zuerst auf Null. – bclymer

Verwandte Themen