首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >runOnUiThread片段

runOnUiThread片段
EN

Stack Overflow用户
提问于 2013-05-07 17:32:36
回答 7查看 141.7K关注 0票数 153

我试着把一个活动转化成碎片。runOnUiThread上的错误标记。关于过去:

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

(运行正常)现在:

GoogleActivityV2是从片段扩展而来的。runOnUiThread在ExecuteTask班。类ExecuteTask嵌套在活动上。(runOnUiThread错误)

这是我的密码

代码语言:javascript
运行
复制
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
    }
}

错误说:

如何纠正此错误?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-05-07 17:35:58

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

是因为:

1)调用runOnUiThread中的隐式runOnUiThread指的是AsyncTask,而不是片段。

2) doesn't have runOnUiThread.

does.

注意,如果您已经在主线程上,Activity只执行Runnable,否则它将使用Handler。在您的片段中的Handler --如果您不想担心this的上下文,实际上非常容易:

代码语言:javascript
运行
复制
// 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中,这已经在主线程上了。

票数 325
EN

Stack Overflow用户

发布于 2020-01-09 00:16:38

使用Kotlin扩展函数

代码语言:javascript
运行
复制
fun Fragment?.runOnUiThread(action: () -> Unit) {
    this ?: return
    if (!isAdded) return // Fragment not attached to an Activity
    activity?.runOnUiThread(action)
}

然后,在任何Fragment中,只需调用runOnUiThread即可。这使得调用在活动和片段之间保持一致。

代码语言:javascript
运行
复制
runOnUiThread {
    // Call your code here
}

注意:如果Fragment不再附加到Activity上,则不会调用回调,也不会引发异常。

如果您想从任何地方访问此样式,可以添加一个公共对象并导入该方法:

代码语言:javascript
运行
复制
object ThreadUtil {
    private val handler = Handler(Looper.getMainLooper())

    fun runOnUiThread(action: () -> Unit) {
        if (Looper.myLooper() != Looper.getMainLooper()) {
            handler.post(action)
        } else {
            action.invoke()
        }
    }
}
票数 14
EN

Stack Overflow用户

发布于 2020-08-20 10:04:58

对Kotlin来说,只需做这个

代码语言:javascript
运行
复制
activity?.runOnUiThread(Runnable {
        //on main thread
    })
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16425146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档