【问题标题】:how to call class AsyncTask to another class?如何将 AsyncTask 类调用到另一个类?
【发布时间】:2015-01-19 19:27:02
【问题描述】:

我试图从另一个名为“MainActivity”的类中调用“AsyncTask”类,但“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) {           
            ...
        }
    }
}

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    首先,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);
    

    【讨论】:

    • 感谢您的回答。我可以在哪里使用这些值?
    • 查看我的编辑 @papo 。我刚刚更改了AsyncTaskdoInBackground
    【解决方案2】:

    使GetAddressTask静态:

    public static class GetAddressTask
    

    【讨论】:

    • 感谢您的回复。我在参考“未使用字段 SitesAdapter.GetAddressTask.mainActivity 的值”中有警告,并且在调用类“GetAddressTask 无法解析为类型”时出现错误
    • 好像没有导入GetAddressTask
    • 如果您不在 AsyncTask 中使用 MainActivity,那么只需删除该字段和构造函数即可。
    【解决方案3】:

    试试这个,这对我有用。

    只需在您的 SitesAdapter 类中创建一个方法,然后从您的 MainActivity 调用它,如下所示:

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

    现在在你的SitesAdapter 课堂上这样做:

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

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      你可以把它设为static 然后用

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

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

      如果您需要从任务中更新您的 UI,您可以 see this answer 使用 interface 并回调您的调用 Activity

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多