如何将类AsyncTask调用到另一个类?

时间:2014-11-21 15:36:42

标签: android android-asynctask

我试着打电话给" AsyncTask"来自另一个名为" MainActivity"但是" AsyncTask"类位于名为" SiteAdapter"的类中。我试图传递一个引用,但它不起作用。怎么可能呢?

主要活动:

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("StackSites", "OnCreate()");
        setContentView(R.layout.activity_main);

        //Call the class AsyncTask
        new GetAddressTask(this).execute(); // <----ERROR - GetAddressTask cannot be resolved to a type
    }
}

SitesAdapter类中的AsyncTask:

public class SitesAdapter extends ArrayAdapter<StackSite> { 
    ...//PROCESS

    public class GetAddressTask extends AsyncTask<String, Void, String> {
        Context mContext;
        public GetAddressTask(Context context) {
            super();
            mContext = context;
        }

        //Pass a reference to MainActivity
        private MainActivity mainActivity; // <--- WARNING - The value of the field SitesAdapter.GetAddressTask.mainActivity is not used            
        public GetAddressTask(MainActivity mainActivity)
        {
            this.mainActivity = mainActivity;
        }                           

        @Override
        protected String doInBackground(String... arg0) {
            ...         
        }

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

4 个答案:

答案 0 :(得分:4)

首先,MainActivity不是您无法定义对象的类。它扩展了Activity

用它更改你的AsyncTask课程;

public static class GetAddressTask extends AsyncTask<String, Void, String> {
    Context mContext;
    public GetAddressTask(Context context) {
         super();
         mContext = context;
    }                          

    @Override
    protected String doInBackground(String... values) {
        // If you want to use 'values' string in here
        String values = values[0];        
    }

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

然后用它来调用它;

String values = ""; //You can pass any string value to GetAddressTask with that parameter
//Call the class AsyncTask
new SitesAdapter.GetAddressTask(this).execute(values);

答案 1 :(得分:3)

make GetAddressTask static:

public static class GetAddressTask

答案 2 :(得分:2)

试试这个,这对我有用。

只需在SitesAdapter课程中创建一个方法,然后通过这样的MainActivity来调用它:

new SitesAdapter().start(MainActivity.this);

现在在SitesAdapter课程中执行此操作:

private Context mContext;
public void start(){
   mContext = context;
   new GetAddressTask().execute();
}

这可以帮助你

答案 3 :(得分:0)

您可以将其设为static,然后使用

进行调用
SitesAdapter.GetAddressTask myClass = new SitesAdapter.GetAddressTask();
myClass.execute();

但是,如果您在多个活动中需要这个,那么将它从该类中取出并将其放在自己的文件中可能是值得的。

如果您需要更新任务中的用户界面,可以see this answer使用interface回复您的来电Activity