2014-11-21 24 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(); 
} 

願這幫助你

相關問題