2013-05-07 32 views
76

Tôi đang cố chuyển đổi Hoạt động thành phân đoạn. Dấu lỗi trên runOnUiThread. về quá khứ:runOnUiThread trong đoạn

GoogleActivityV2 mở rộng từ Hoạt động. runOnUiThread trong lớp ExecuteTask. class ExecuteTask lồng vào hoạt động.

(Run ok) bây giờ:

GoogleActivityV2 kéo dài từ Fragment. runOnUiThread trong lớp ExecuteTask. class ExecuteTask lồng vào hoạt động. (Lỗi trên runOnUiThread)

đây là mã của tôi

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

lỗi nói: Eclipse Error

thế nào tôi có thể khắc phục lỗi này?

+5

Mã bạn viết bên trong onPostExecute đã chạy bên trong chuỗi chính. Mặt khác, bạn không cần phải invoce runOnUiThread(). – rciovati

+0

@rciovati "làm điều gì đó" vào và ra trênPostExecute là khác nhau – Dolphin

+0

@ Danol i bỏ phiếu cho câu hỏi này nó giúp tôi rất nhiều .. –

Trả lời

187

Hãy thử điều này: getActivity().runOnUiThread(new Runnable...

Đó là vì:

1) ngầm this trong lệnh gọi runOnUiThread là đề cập đến AsyncTask, không mảnh của bạn.

2) Fragment không có runOnUiThread

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

tuy nhiên Activity làm:

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

Lưu ý rằng điều này chỉ thực thi Runnable nếu bạn đã trên chuỗi chính và sử dụng Handler nếu bạn không ở trên luồng chính. Bạn có thể thực hiện một Handler trong đoạn của bạn nếu bạn không muốn phải lo lắng về bối cảnh this, nó thực sự rất dễ dàng:

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

EDIT: @rciovati là đúng, bạn đang ở trong onPostExecute, đó là đã có trên sợi chính.

+0

cảm ơn nó giúp tôi rất nhiều .. tôi bỏ phiếu lên –

+0

Một số lần getActivity(). RunOnUiThread là kết quả vào NullPointerException . Bạn có thể giải thích? – developer1011

+1

@ developer1011 sẽ xảy ra khi đoạn được tách ra khỏi hoạt động. Điều này là phổ biến trong các tác vụ không đồng bộ, vì hoạt động có thể đã bị hủy trong suốt quá trình chạy dài, do đó nó không còn tồn tại với 'get' nữa. Luôn kiểm tra null trước. – bclymer

Các vấn đề liên quan