如何在没有get()方法的情况下正确地将AsyncTask回调的返回值传递给另一个类?

时间:2014-05-13 17:08:47

标签: android android-asynctask callback return-value

在我的应用程序中,我需要调用Web服务从Internet获取一些数据。为避免阻止UI,我使用AsyncTask来执行此操作。但是我有问题正确传递返回值以供进一步使用。我想我在这里犯了一些建筑错误。这就是我的应用程序应该如何构建的结构:

MainActivity Activity包含TextViewButtonSoapParser(见下文)。我想通过按Button来调用Web服务,解析结果并将其显示在TextView

SoapRequestTask AsyncTask具有this等回调机制。 doInBackground()的返回值为SoapObject,并作为listener.onTaskCompleted(SoapObject)中回调方法onPostExecute()中的参数传递给侦听器。

SoapRequestManager :应该有方法public SoapObject makeRequest(someParams)的类。此方法应该使用我的AsyncTask并从SoapObject返回doInBackground()

MySpecialRequestManager :扩展SoapRequestManager并使用不同的方法调用Web服务以获得不同的结果。这些方法中的每一种都使用超类的makeRequest(someParams)

SoapParser :一个将SoapObject解析为String的类,以便它可以显示在我的ActivityTextView。它应该有public String parseResult(SoapObject)

之类的方法

如何正确使用回调和返回值?哪个类应该实现回调接口?

1 个答案:

答案 0 :(得分:0)

只是一个快速的片段,因为你要求一些代码。这可能有助于您入门

在SoapRequestTask中的AsyncTask的postExecute()方法

Intent intent = new Intent("send_data");
intent.setAction("SEND_DATA");              // don't NEED this, as we implicitly
                                            // declare our intent during initialization
intent.putExtra("data_return_key", mData);  // where mData is what you want to return
sendBroadcast(intent);

然后是SoapRequestManager

public class SoapRequestManager implements BroadcastReceiver{
    int mData;                        // assuming our data is an int in this example

    // Default constructor
    public SoapRequestManager(){
        registerReceiver(this, new IntentFilter("send_data"));
        // if you use setAction use the below registration instead
        // registerReceiver(this, new IntentFilter("SEND_DATA"));
    }

    //... All of the stuff you have in the class already

    @Override
    public void onReceive(Context context, Intent intent){
        // For this example let's say mData is an integer value

        // if you use setAction, check that the intent is the correct one via
        // if (intent.getAction().equals("SEND_DATA"))
        mData = intent.getIntExtra("data_return_key");
    }
}