我想创建一个通用的AsynceTask类,我的所有活动都使用/共享来从网址下载内容。因此,除了将内容发送回调用AsyncTask类的活动中的某个方法之外,我不希望OnPostExecute执行任何操作。
我知道我需要创建一个构造函数来设置调用AsyncTask
的Activity的上下文,但接下来是什么,我如何使用上下文将某些内容发送回与该上下文相对应的活动。我没见过教程如何以这种方式使用上下文。
让我说我有:
public class LoginActivity {
public int ActivityMember;
public void HandleButtonClick(void){
DownloadFromURL task = new DownloadFromURL(this);
task.execute(url);
}
public void HandleLoginResult(int x){
ActivityMember = x;
}
}
现在在一个单独的java文件中我有:
private class DownloadFromURL extends AsyncTask<List<NameValuePair>, Long, JSONObject> {
Context context;
public void DownloadFromURL (Context context){
this.context = context;
}
@Override
protected void onPostExecute(JSONObject json) {
context.(<- *my question involves this part of code)
}
}
我很确定我无法在context.ActivityMember
内调用context.HandleLoginResult(y)
或onPostExecute
,因为上下文不属于LoginActivity
类型,它是一个上下文。
那么如何使用它的上下文访问属于LoginActivity
的成员或方法?
答案 0 :(得分:2)
您可以使用((ActivityName)contextName).methodName()
但这不是一个好的解决方案。您可以尝试this
之类的内容答案 1 :(得分:1)
将您的活动名称与上下文一起传递给异步类。
protected void onPostExecute(SoapObject result)
{
if(classname.equals("LoginActivity"))
{
((LoginActivity) object).method();
}
else if(classname.equals("MainActivity"))
{
((MainActivity) object).method();
}
}
答案 2 :(得分:0)
很容易做到,您只需在活动中创建一个方法,并从通过AsyncTask父类构造函数的实例中调用它。
假设您的活动中有这样的内容:
public void Foo(ArrayList<DataType> data)
{
//Do some with data
}
然后从onPostExecute中调用此方法,如下所示:
@Override
protected void onPostExecute(ArrayList<DataType> data)
{
activity.Foo(data);
}
其中activity是通过构造函数传递的实例。 干杯
答案 3 :(得分:0)
这涉及基本的面向对象编程知识。
如果仔细查看http://developer.android.com/reference/android/app/Activity.html,您可以看到Activity扩展Context,这就是为什么您可以将this
传递给AsyncTask构造函数并让编译器执行所需的对象切片。
我们可以利用这个优势:创建一个扩展Activity的抽象类(比方说:DataActivity,只是一个例子,无论你想要什么名称),并在其上编写一个名为onDataDownloadComplete(JSONObject json)
的方法(一个回调) ,你可以调用AsyncTask的onPostExecute
。使所有活动从DataActivity扩展并实现该方法。将AsyncTask上下文从Context更改为DataActivity,以便您可以调用onDataDownloadComplete
回调并完成。同样,DataActivity将扩展Activity和Activity扩展Context,DataActivity或任何扩展它将是AsyncTask的有效上下文。
希望你觉得这很有用。
答案 4 :(得分:0)
我意识到还有另一种方法来实现我想要做的事情。这会消除Asyncrony,但对于登录的情况,我实际上希望UI在应用程序尝试登录时处于非活动状态。
打电话后
asyncTask.execute()
我可以打电话
asyncTask.get()
这将检索doInBackground的结果并允许您在现场运行它。或者我可以使用超时,所以我不会永远阻止:
asynceTask.get(5000, TimeUnit.MILLISECONDS)