如何使用Context来访问/操纵另一个类/活动

时间:2013-05-04 06:37:31

标签: android multithreading android-context

我想创建一个通用的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的成员或方法?

5 个答案:

答案 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)