片段中的 runOnUiThread

新手上路,请多包涵

我正在尝试将 Activity 转换为片段。 runOnUiThread 上的错误标记。关于过去:

GoogleActivityV2 从 Activity 扩展而来。 ExecuteTask 类中的 runOnUiThread。类 ExecuteTask 嵌套在活动上。

(运行正常)现在:

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

错误说:日食错误

我该如何解决这个错误?

原文由 Tai Dao 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 666
2 个回答

试试这个: getActivity().runOnUiThread(new Runnable...

这是因为:

  1. 隐含的 this 在您对 runOnUiThread 的调用中指的是 AsyncTask,而不是您的片段。

  2. Fragment 没有runOnUiThread。

但是, Activity 可以。

请注意 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 中,这已经在主线程上。

原文由 bclymer 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于片段上的 Kotlin,只需执行此操作

activity?.runOnUiThread(Runnable {
        //on main thread
    })

原文由 patel dhruval 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题