如何在另一个类中调用AsyncTask类?

3

我尝试从名为“MainActivity”的其他类中调用“AsyncTask”类,但是“AsyncTask”类位于名为“SiteAdapter”的类中。我尝试传递一个引用但是不起作用。如何解决这个问题?

Main Activity:

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个回答

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);

谢谢您的回答。这些值可以在哪里使用? - Paul Proaño
请看我的编辑@papo。我刚刚修改了AsyncTaskdoInBackground方法。 - Batuhan Coşkun

3
使GetAddressTask静态化:
public static class GetAddressTask

感谢您的回复。我在引用中收到了一个警告:“SitesAdapter.GetAddressTask.mainActivity字段的值未被使用”,并且在调用“GetAddressTask”类时出现了错误:“无法解析类型GetAddressTask”。 - Paul Proaño
似乎没有导入GetAddressTask。 - debi
如果您在AsyncTask中没有使用MainActivity,则可以将此字段和构造函数一并删除。 - debi

2

尝试这个,这对我有效。

只需在您的SitesAdapter类中创建一个方法,并像这样从您的MainActivity中调用它:

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

现在在你的SitesAdapter类中进行以下操作:

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

希望这能对您有所帮助


0
你可以将它设为 static,然后调用它。
SitesAdapter.GetAddressTask myClass = new SitesAdapter.GetAddressTask();
myClass.execute();

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

如果您需要从任务更新UI,则可以查看此答案,了解如何使用回调与您的调用Activityinterface


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接