アクティビティをフラグメントに変換しようとしています。runOnUiThread
過去のエラー マーク:
GoogleActivityV2 は Activity から拡張されます。ExecuteTask クラスの runOnUiThread です。ExecuteTask クラスは activity にネストされています。
(実行OK) 今:
GoogleActivityV2 は Fragment から拡張されます。ExecuteTask クラスの runOnUiThread。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
}
}
エラーには次のように書かれています:
このエラーを修正するにはどうすればいいでしょうか?
ベストアンサー1
これを試して:getActivity().runOnUiThread(new Runnable...
その理由は:
this
1)呼び出し内の暗黙の部分はrunOnUiThread
フラグメントではなく AsyncTask を参照しています。
2)Fragment
runOnUiThread がありません。
すでにメイン スレッドにいる場合は のみActivity
を実行し、そうでない場合は を使用することに注意してください。Runnable
Handler
実装できるのはHandler
フラグメント内で のコンテキストを気にしたくない場合はthis
、実はとても簡単です:
// A class instance
private Handler mHandler = new Handler(Looper.getMainLooper());
// anywhere else in your code
mHandler.post(<your runnable>);
// ^ this will always be run on the next run loop on the main thread.
編集: @rciovati さんは正しいです。あなたは にいますonPostExecute
。それはすでにメイン スレッドにあります。