Java 确保异步线程在ui线程上运行
我有一些对象(不在ui线程上)需要作为内部方法运行异步任务,我希望将ui线程传递给该方法,然后以这种方式在异步任务上实现ui线程——有没有办法做到这一点 伪代码:Java 确保异步线程在ui线程上运行,java,android,Java,Android,我有一些对象(不在ui线程上)需要作为内部方法运行异步任务,我希望将ui线程传递给该方法,然后以这种方式在异步任务上实现ui线程——有没有办法做到这一点 伪代码: public class EditDetails extends Activity{ MyObject obj = new obj; obj.syncWithServer(EditDetails.this); }
public class EditDetails extends Activity{
MyObject obj = new obj;
obj.syncWithServer(EditDetails.this);
}
public class MyObject {
public void syncWithWerver(EditDetails parent){
final class GetUserHttpTask extends AsyncTask<String/* Param */, Boolean /* Progress */, String /* Result */> {
@Override
protected String doInBackground(String... params) {
return "";
}
@Override
protected String onPostExecute(String result) {
//this doesn't run
}
}
}
}
公共类EditDetails扩展活动{
MyObject obj=新obj;
对象syncWithServer(EditDetails.this);
}
公共类MyObject{
public void syncWithWerver(编辑详细信息父项){
最后一个类GetUserHttpTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…参数){
返回“”;
}
@凌驾
受保护的字符串onPostExecute(字符串结果){
//这个不能运行
}
}
}
}
注意:目前这不起作用,因为onPostExecute在doInBackground之后没有启动
编辑
此代码是伪代码。实际问题仍在发生,我已经列出了它。。基本上,在运行pastebin中的第72行之后,它会被卡住,而不会执行onPostExecute奇怪到应该是void
。我想知道您的代码是如何编译的,因为您已经更改了重写方法的返回类型
更正onPostExecute
后,可以按如下方式运行AsyncTask
:
final class GetUserHttpTask extends AsyncTask<String/* Param */, Boolean /* Progress */, String /* Result */> {
@Override
protected String doInBackground(String... params) {
return "";
}
@Override
protected String onPostExecute(String result) {
// this will run
}
}
public void syncWithWerver(EditDetails parent){
AsyncTask task = new GetUserHttpTask();
task.execute();
}
final类GetUserHttpTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…参数){
返回“”;
}
@凌驾
受保护的字符串onPostExecute(字符串结果){
//这将运行
}
}
public void syncWithWerver(编辑详细信息父项){
AsyncTask task=new GetUserHttpTask();
task.execute();
}
奇怪到应该是void
。我想知道您的代码是如何编译的,因为您已经更改了重写方法的返回类型
更正onPostExecute
后,可以按如下方式运行AsyncTask
:
final class GetUserHttpTask extends AsyncTask<String/* Param */, Boolean /* Progress */, String /* Result */> {
@Override
protected String doInBackground(String... params) {
return "";
}
@Override
protected String onPostExecute(String result) {
// this will run
}
}
public void syncWithWerver(EditDetails parent){
AsyncTask task = new GetUserHttpTask();
task.execute();
}
final类GetUserHttpTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…参数){
返回“”;
}
@凌驾
受保护的字符串onPostExecute(字符串结果){
//这将运行
}
}
public void syncWithWerver(编辑详细信息父项){
AsyncTask task=new GetUserHttpTask();
task.execute();
}
您是否尝试过这样执行任务
parent.runOnUiThread(new Runnable() {
@Override
public void run() {
new GetUserHttpTask().execute();
}
});
我认为这应该行得通
添加:
您的实施应如下所示:
注意:阅读更新后的评论
class GetUserHttpTask extends AsyncTask<String/* in parameter for doInBackground */, Boolean /* in parameter for onProgressUpdate */, String /* Out parameter and in parameter for onPostExecute method*/> {
@Override
protected String doInBackground(String... params) {
return "";
}
@Override
protected void onPostExecute(String result) {
// this doesn't run
}
@Override
protected void onProgressUpdate(Boolean... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
}
类GetUserHttpTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…参数){
返回“”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//这个不能运行
}
@凌驾
受保护的void onProgressUpdate(布尔值){
//TODO自动生成的方法存根
super.onProgressUpdate(值);
}
}
您是否尝试过这样执行任务
parent.runOnUiThread(new Runnable() {
@Override
public void run() {
new GetUserHttpTask().execute();
}
});
我认为这应该行得通
添加:
您的实施应如下所示:
注意:阅读更新后的评论
class GetUserHttpTask extends AsyncTask<String/* in parameter for doInBackground */, Boolean /* in parameter for onProgressUpdate */, String /* Out parameter and in parameter for onPostExecute method*/> {
@Override
protected String doInBackground(String... params) {
return "";
}
@Override
protected void onPostExecute(String result) {
// this doesn't run
}
@Override
protected void onProgressUpdate(Boolean... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
}
类GetUserHttpTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…参数){
返回“”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//这个不能运行
}
@凌驾
受保护的void onProgressUpdate(布尔值){
//TODO自动生成的方法存根
super.onProgressUpdate(值);
}
}
@PareshMayani不,该方法始终返回void。参数类型为changed@Perception如果我不认为这是解决整个问题的关键,我会将其作为评论发布。基本上,他没有正确地声明onPostExecute
onPostExecute,因此它没有被触发。@PareshMayani Yes@Boris是正确的。onPostExecute
的返回类型应为void
。结果类型String
用于doInBackground
方法而不是onPostExecute
method是的,很抱歉它返回了void
它是一个typo@user2083181我在我的报告中增加了额外的建议answer@PareshMayani不,该方法总是返回void。参数类型为changed@Perception如果我不认为这是解决整个问题的关键,我会将其作为评论发布。基本上,他没有正确地声明onPostExecuteonPostExecute,因此它没有被触发。@PareshMayani Yes@Boris是正确的。onPostExecute
的返回类型应为void
。结果类型String
用于doInBackground
方法而不是onPostExecute
method是的,很抱歉它返回了void
它是一个typo@user2083181我在回答中添加了额外的建议,您应该更改Boris提到的onPostExecute
方法的返回类型,并尝试上述方法代码片段。它应该可以工作。我添加了这个代码段-我无法让onPostExecute运行,但是结果发生在doInBackground中,所以没关系。我在结果响应中使用“ok”代码手动运行它。您应该更改Boris提到的onPostExecute
方法的返回类型,然后尝试上面的代码段。它应该可以工作。我已经添加了这个代码段-我无法让onPostExecute运行,但是结果发生在doInBackground中,所以没关系。我在结果响应中使用“ok”代码手动运行了它