2013-02-14 61 views
1

我试图创建一个全局动作文件,我可以在应用程序中的任何地方全局调用某些函数。到目前为止,我已经得到它与函数等工作,但现在我想要做的是把一个标准的AsyncTask到我的全局行动,并从我的活动传递它的函数/空白,所以我想要传递一个函数来运行背景和一次运行完成后的功能。有谁知道这是怎么回事?并且还建议我在后台线程上运行多个函数我是否创建一个AsyncTask并以多个函数提供或者是否创建多个AsyncTasks?将函数传递到全局AsyncTask Android

继承人我到目前为止设法做到的全球范例以及我目前如何实施我的Asynctask。只是为了重申我试图将asynctask移动到全局行为并尽可能重复使用

在我的全局动作im创建一个函数,制定一个URL并发送post变量到该url然后反馈一个JSON响应。然后在我的活动我已经创建了以下两种功能调用请求,然后记录响应

我的全球行动

public final static JSONObject startAPICallRequest(Context activityContext, String requestReference, String callLocation, Map<String, String> postVarsMap, Map<String, String> getVarsMap){ 

      long unixTimeStamp = System.currentTimeMillis()/1000L; 

      StringBuilder extraGetVarsString = new StringBuilder(); 
      if(getVarsMap != null){ 
       Map<String, String> map = (Map)getVarsMap; 
       for (Entry<String, String> entry : map.entrySet()) { 
        extraGetVarsString.append("&" + entry.getKey() + "=" + entry.getValue()); 
        extraGetVarsString.toString(); 
       } 
      } 

      String appVersion = null; 

      try { 
       appVersion = activityContext.getPackageManager().getPackageInfo(activityContext.getPackageName(), 0).versionName; 

      } catch (NameNotFoundException e) { 
       e.printStackTrace(); 

       appVersion = activityContext.getResources().getString(R.string.appVersion); 
      } 
      String getVarsString = "?timestamp=" + unixTimeStamp + "&app_version=" + appVersion + extraGetVarsString; 
      String apiLocation = activityContext.getResources().getString(R.string.apiLocation); 
      String fullAPIURL = apiLocation + callLocation + getVarsString; 

      Log.v("globals", "fullAPIURL=" + fullAPIURL); 

      String api_key = activityContext.getResources().getString(R.string.apiKey); 
      String api_user = activityContext.getResources().getString(R.string.apiUser); 
      String request_token = returnSHAFromString(api_key, fullAPIURL); 
      String device_id = returnStringFromPreference(activityContext,"device_id"); 
      String user_token = returnStringFromPreference(activityContext,"user_token"); 

      List<NameValuePair> postVarsList = new ArrayList<NameValuePair>(); 
      postVarsList.add(new BasicNameValuePair("request_token", request_token)); 
      postVarsList.add(new BasicNameValuePair("api_user", api_user)); 
      postVarsList.add(new BasicNameValuePair("device_id", device_id)); 
      postVarsList.add(new BasicNameValuePair("user_token", user_token)); 

      if(postVarsMap != null){ 
       Map<String, String> map = (Map)postVarsMap; 
       for (Entry<String, String> entry : map.entrySet()) { 
        postVarsList.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); 
       } 
      } 


      JSONObject responseJSON = null; 

      try { 
       HttpClient client = new DefaultHttpClient(); 
       HttpPost post = new HttpPost(fullAPIURL); 
       post.setEntity (new UrlEncodedFormEntity(postVarsList)); 

       HttpResponse response = client.execute(post); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
       String jsonResponse = reader.readLine(); 

       Log.v("globals", "postList =" + postVarsList); 

      } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      return responseJSON; 

     } 

我的活动

public void apiCall(){ 
     responseJSON = GlobalActions.startAPICallRequest(this, "login", "my-network/", null, null); 
    } 


    public class PostTask extends AsyncTask<Void, String, Boolean> { 

     protected void onPreExecute() { 
      super.onPreExecute(); 

     } 

     @Override 
     protected Boolean doInBackground(Void... params) { 

      apiCall(); 
      boolean result = false; 
      publishProgress("progress"); 

      return result; 
     } 

     protected void onProgressUpdate(String... progress) { 
      StringBuilder str = new StringBuilder(); 
       for (int i = 1; i < progress.length; i++) { 
        str.append(progress[i] + " "); 

       } 
     } 

      @Override 
     protected void onPostExecute(Boolean result) { 
      super.onPostExecute(result); 
      checkLoginData(); 
      } 
    } 

    public void checkLoginData(){ 

     Log.v("IntroLoader", "responseJSON = " + responseJSON); 
     Intent register = new Intent(getApplicationContext(), LoginForm.class); 
     startActivity(register); 
    } 

回答

1

使用AsyncTask调用REST API的方法是没有真正正确的做法。您的代码有2个问题:

  • 没有保证您的API调用将在活动被关闭,因为过程可以
  • 你有内存泄漏,因为PostTask可容纳活动参考即使活动可以被杀死完成已销毁

考虑使用IntentService进行后台请求和e。 G。 ResultReceiver用于处理您的Activity中的结果。

+0

有趣的是,从未使用intentservice之前,你能告诉我如何在我的代码中实现它吗? – 2013-02-15 09:18:12

0

我不是Java专家,但我不认为你在Java中传来传功能。为了简化这个问题,当AsyncTask完成时,你想要做什么是在你的Activity类中调用一个函数?