我正在尝试将活动转换为片段。< code>runOnUiThread上的错误标记。关于过去:
GoogleActivityV2从活动扩展而来。在类ExecuteTask中运行Nuithread。类ExecuteTask嵌套在活动上。
(运行正常)现在:
GoogleActivityV2从片段扩展而来。在类ExecuteTask中运行Nuithread。类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
}
}
如何修复此错误?
对于 Kotlin 上的片段,只需执行此操作
activity?.runOnUiThread(Runnable {
//on main thread
})
fun Fragment?.runOnUiThread(action: () -> Unit) {
this ?: return
if (!isAdded) return // Fragment not attached to an Activity
activity?.runOnUiThread(action)
}
然后,在任何片段
中,您都可以调用runOnUiThread
。这使呼叫在活动和片段之间保持一致。
runOnUiThread {
// Call your code here
}
注意:如果片段
不再附加到活动
,则不会调用回调,也不会抛出异常
如果要从任何位置访问此样式,可以添加一个公共对象并导入该方法:
object ThreadUtil {
private val handler = Handler(Looper.getMainLooper())
fun runOnUiThread(action: () -> Unit) {
if (Looper.myLooper() != Looper.getMainLooper()) {
handler.post(action)
} else {
action.invoke()
}
}
}
试试这个:< code>getActivity()。runOnUiThread(新的Runnable...
这是因为:
1) 调用runOnUiThread
中的隐式this
,指的是异步任务,而不是片段。
2)片段
没有runOnUiThread。
但是,< code>Activity可以。
请注意,如果您已经在主线程上,active
只执行Runnable
,否则它使用Handler
。如果您不想担心this
的上下文,您可以在您的片段中实现Handler
,这实际上非常简单:
// 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是对的,你在PostExecute,
这已经在主线程上了。
我有一些RadioButton在片段A,,和一些RadioButton在片段B我希望当这些(FragmentA)之一,在FragmentB禁用所有单选按钮.相同的活动主机这些片段。 片段A中的事件单击单选按钮:
我已经将选项设置为我的时区(并且我也尝试了),这样就节省了时间,但是,当从数据库读取时间时,Sequelize会将其转换为UTC。我也尝试了不同的时区,每一个都正确保存,但总是转换为UTC时,从数据库读取。 是我做错了什么,还是这是一个已知的问题,有什么解决方法吗?
主要内容:字符读取函数 fgetc,字符写入函数 fputc在C语言中,读写文件比较灵活,既可以每次读写一个字符,也可以读写一个字符串,甚至是任意字节的数据(数据块)。本节介绍以字符形式读写文件。 以字符形式读写文件时,每次可以从文件中读取一个字符,或者向文件中写入一个字符。主要使用两个函数,分别是 fgetc() 和 fputc()。 字符读取函数 fgetc fgetc 是 file get char 的缩写,意思是从指定的文件中读取一个字符。fget
我正在尝试学习如何在片段中显示具有3列的网格视图。值来自strings.xml文件作为数组列表。当我运行应用程序时,它会崩溃。有人能帮助我在3列中显示值,即位置、描述和时间。我无法继续在gridview中显示读取值。 错误 致命异常:主java。com上的lang.NullPointerException。ts.FlightFragment$MyAdapter。(FlightFragment.ja
问题内容: 我使用HttpResponseMessage类作为AJAX调用的响应,该调用从服务返回JSON数据。从服务返回AJAX调用后暂停执行时,我看到此类包含一个Content属性,该属性的类型为System.Net.Http.StreamContent。 如果在浏览器中进行检查,我会看到成功进行了网络调用,并以JSON数据作为响应。我只是想知道为什么我无法在Visual Studio中看到返
fgets() 有局限性,每次最多只能从文件中读取一行内容,因为 fgets() 遇到换行符就结束读取。如果希望读取多行内容,需要使用 fread() 函数;相应地写入函数为 fwrite()。 对于 Windows 系统,使用 fread() 和 fwrite() 时应该以二进制的形式打开文件,具体原因我们已在《 文本文件和二进制文件到底有什么区别》一文中进行了说明。 fread() 函数用来从