2014-11-21 43 views
3

我试图从名为“MainActivity”的另一个类调用“AsyncTask”类,但“AsyncTask”类位于名为“SiteAdapter”的类内。我试图通过一个参考,但它不工作。怎么可能做到这一点?如何将AsyncTask类调用到另一个类?

主要活动:

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 
    } 
} 

的AsyncTask SitesAdapter类中:

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

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

谢谢你的回答。这个值可以在哪里使用它们? – 2014-11-21 17:20:14

+0

看我的编辑@papo。我只是改变了'AsyncTask'的'doInBackground'。 – 2014-11-21 17:31:43

3

使GetAddressTask静:

public static class GetAddressTask 
+0

感谢您的回应。我在德引用“不使用的字段SitesAdapter.GetAddressTask.mainActivity价值”的警告,在调用类“GetAddressTask不能被解析为一个类型” – 2014-11-21 15:50:09

+0

一个错误似乎GetAddressTask不导入 – debi 2014-11-21 15:55:20

+0

,如果你不在你的AsyncTask中使用MainActivity,然后简单地删除这个字段和一个构造函数。 – debi 2014-11-21 15:59:29

0

你可以使它static然后用

SitesAdapter.GetAddressTask myClass = new SitesAdapter.GetAddressTask(); 
myClass.execute(); 

叫它但是,如果你将要需要这个在多个活动,那么它可能是值得的,把它从这个类,并把它放在自己的文件。

如果您需要从任务中更新您的用户界面,您可以使用interface并使用Activity的回调拨打电话see this answer

2

试试这个,这对我有用。

SitesAdapter类只需创建一个方法,并从您的MainActivity这样称呼它:

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

SitesAdapter类做到这一点:

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

愿这帮助你