0

在我的 android 项目中,我试图调用一个返回字符串结果的 Web 服务。执行后,结果将在 UI 线程中使用 onPostExecution() 更新,结果将决定是移动到下一个活动还是通知用户更正信息。

以上是我从下面的代码中实现的意图:

 BackgroundTask bcktask = new BackgroundTask();
        bcktask.execute(servicemethodname, urlparameter, bMap);
    Thread.sleep(1000);
    //do nothing
    while (backgroundResult == null)
        ;

    if (backgroundResult == "Sucessfully Registered") {
        Intent intent = new Intent(this, VerifyDetail.class);
        startActivity(intent);
    } else {
        Toast.makeText(this, backgroundResult, Toast.LENGTH_LONG)
                .show();
    }

但问题是,当我尝试运行上面的代码时,它卡在 UI 线程并且后台线程没有运行,或者可能没有得到 CPU 时间来执行。请告诉我如何才能完成这项工作。如果结果未成功注册或屏幕将更改为下一个活动,我需要保持活动并显示一条消息(出了什么问题) 。

谢谢和问候,
苏拉布

4

6 回答 6

1

在 onPostExecute 中执行此操作,而不是在 Async 任务中执行此操作,而不是在 while 循环后执行此操作。

 protected void onPostExecute(Long result) {
     if (backgroundResult == "Sucessfully Registered") {
        Intent intent = new Intent(this, VerifyDetail.class);
        startActivity(intent);
    } else {
        Toast.makeText(this, backgroundResult, Toast.LENGTH_LONG)
            .show();
    }
}

删除导致 UI 被触发的 while 循环。

于 2013-07-11T12:24:35.667 回答
0

AsyncTask就是你要找的东西!有一个例子。随意问,如果你有任何问题!

于 2013-07-11T12:23:36.257 回答
0

您可以在任务的构造函数中放置一个回调来实现这一点。

伪代码:

创建如下界面

public interface MyCallback {
    public void onResult(String result);
}

在代码中的某处实现此接口:

MyCallback callback = new MyCallback() {
    @Override
    public void onResult(String result) {
        if(result.equals("Sucessfully Registered") {
            // success
        } else {
            // not success
        }
    }
}

在任务的构造函数中传递此回调并将其存储为局部变量 mCallback;

new BackgroundTask(callback).execute(...);

在您的 onPostExecute() 方法中:

mCallback.onResult("<web service result String>");

请注意,以上内容未经测试,可能包含轻微的语法错误。祝你好运。

于 2013-07-11T12:27:36.100 回答
0

为什么不像这样在 onPostExecute() 中使用你的代码:它肯定会工作

    protected void onPostExecute(String (backgroundResult) {
        super.onPostExecute((backgroundResult);

        if(myProgressDialog!=null){
            myProgressDialog.dismiss();
            myProgressDialog = null;
        }

        if(backgroundResult != ""){
                if (backgroundResult == "Sucessfully Registered") {
                    Intent intent = new Intent(this, VerifyDetail.class);
                    startActivity(intent);
                } else {
                    Toast.makeText(this, backgroundResult, Toast.LENGTH_LONG).show();
                }
        }
    }
于 2013-07-11T12:31:03.337 回答
0

您的问题出在 while 循环/背景结果组合中。我无法从所提供的内容中判断 backgroundResult 的来源,但如果您使用 (1) wait (2) get (3) 或任何需要停止 UI 线程的东西,这就是您的问题所在。

Morten 使用回调的解决方案是在正确的轨道上。这需要与 a 相结合AsyncTask才能达到正确的结果。

(1) 创建接口

public interface OnTaskDone {
    public void onResult(String resultString);
}

(2) 创建一个异步任务,在其构造函数中采用该接口。

public class DownloadTask extends AsyncTask<String, Void, String>{

    private OnTaskDone listener = null;

    public DownloadTask(OnTaskDone listener){
        this.listener = listener;
    }

    @Override
    protected String doInBackground(String . . . params){
        //do your i/o stuff here
        return stringResult
    }

    @Override
    protected void onPostExecute(String result){
        listener.result(result);
    }

}

这是任务的基本设置。您需要修改它以使用您的活动。基本思想是,通过构造函数传递一个接口将允许您在后台部分完成后回调到起始活动。这样您就可以在您的起始活动/片段中评估结果。

DownloadTask getStuff = new DownloadTask(new OnTaskDone(){

    @Override
    public void onResult(String resultString){
        //check result here and do whatever
    }

});
getStuff.execute(stringParams);
于 2013-07-11T12:58:00.567 回答
0

无需担心同步事物的最佳方法是广播接收器:

这是您在服务中发送广播的方式:

Intent intent = new Intent("YOUR_ACTION");
intent.putExtra("EXTRA", result);
sendBroadcast(intent);

然后你在活动中收到它,并用它做你想做的事:

private BroadcastReceiver mEventReceiver = new BroadcastReceiver(){

    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equalsIgnoreCase("YOUR_ACTION") ){
            String yourExtra = intent.getStringExtra("EXTRA");
            // DO YOUR UI THING!!
        }
    }
};

IntentFilter eventsFilter = new IntentFilter();
eventsFilter.addAction("YOUR_ACTION");
registerReceiver(mEventReceiver, roundsEventsFilter);
于 2013-07-11T12:33:26.920 回答