在我的应用程序中,我需要调用Web服务从Internet获取一些数据。为避免阻止UI,我使用AsyncTask
来执行此操作。但是我有问题正确传递返回值以供进一步使用。我想我在这里犯了一些建筑错误。这就是我的应用程序应该如何构建的结构:
MainActivity
:Activity
包含TextView
,Button
和SoapParser
(见下文)。我想通过按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
的类,以便它可以显示在我的Activity
中TextView
。它应该有public String parseResult(SoapObject)
。
如何正确使用回调和返回值?哪个类应该实现回调接口?
答案 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");
}
}