2013-05-07 55 views
76

我在嘗試將Activity轉換爲片段。 runOnUiThread上的錯誤標記。 過去:runOnUiThread在片段中

GoogleActivityV2擴展自Activity。 runOnUiThread類 ExecuteTask。類嵌套在活動上的ExecuteTask。

(運行OK) 現在:

GoogleActivityV2從片段延伸。 runOnUiThread類 ExecuteTask。類嵌套在活動上的ExecuteTask。 (上 runOnUiThread錯誤)

這裏是我的代碼

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

錯誤說: Eclipse Error

我怎樣才能解決這個問題?

+5

您在onPostExecute中編寫的代碼已經在主線程內運行。另一方面,你不需要調用runOnUiThread()。 – rciovati 2013-05-07 17:35:11

+0

@rciovati「做些什麼」in和out onExpressExecute不同 – Dolphin 2013-05-07 17:37:54

+0

@Dolphin我把這個問題投了給它很多幫助我.. – 2014-12-03 12:06:39

回答

187

試試這個:getActivity().runOnUiThread(new Runnable...

這是因爲:

1)在呼叫隱thisrunOnUiThread是指的AsyncTask,不是你的片段。

2)Fragment沒有runOnUiThread

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

然而Activity做:如果你已經

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

請注意,這只是執行Runnable如果您不在主線程上,則使用Handler。您可以在片段實施Handler如果你不想擔心this的背景下,它實際上是很容易的:

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

編輯:@rciovati是對的,你是在onPostExecute,這已經在主線程上。

+0

感謝它幫助我很多..我投票了 – 2014-12-03 12:36:09

+0

有時候getActivity()。runOnUiThread導致NullPointerException 。你能解釋一下嗎? – developer1011 2016-04-27 19:46:23

+1

@ developer1011將在片段從活動中分離時發生。這在異步任務中很常見,因爲活動可能在長時間運行時被破壞,所以它不再存在。總是先檢查空值。 – bclymer 2016-04-27 21:15:23