2017-01-23 172 views
0

我正在處理一個簡單的函數,該函數用於執行另一個靜態引用調用的HTTP朋友請求。問題是谷歌提供的(Tab Navigator Activity)預構建代碼的片段系統不允許我在那裏使用非靜態方法。使用靜態還是非靜態是一個好主意? (Android)

我稱之爲方法

enviarsolicitud(param1,param2); 

這是無效的代碼,我說

 private static void enviarsolicitud(final String idadder, final String idadded) 
     { 
      class EnviarSolicitudClass extends AsyncTask<String,Void,String> 
      { 
       @Override 
       protected void onPreExecute() 
       { 
        super.onPreExecute(); 
        System.out.println("enter"); 
       } 
       @Override 
       protected void onPostExecute(String s) 
       { 
        super.onPostExecute(s); 
        if(s.contains("friendrequest")){ 
         String[] friendrequest = s.split(":"); 
         System.out.println(friendrequest[0] + " " + friendrequest[1]); 
        } 
        else if (s.contains("friendrequestcant")) 
        { 

        } 
        else 
        { 

        } 
       } 
       @Override 
       //En segon pla 
       protected String doInBackground(String... params) 
       { 
        HashMap<String,String> dades = new HashMap<>(); 
        dades.put("idadder",params[0]); 
        dades.put("idadded",params[1]); 
        RegisterUserClass ruc = new RegisterUserClass(); 
        String resultat = ruc.sendPostRequest("http://www.myurl.net/friend.php",dades); 
        return resultat; 
       } 

      } 
      EnviarSolicitudClass esc = new EnviarSolicitudClass(); 
      esc.execute(idadder,idadded); 
     } 

我不知道了很多關於非靜態代碼和靜態,但問題是,谷歌使用靜態方法預構建的活動。你是否建議爲這種類型的空洞使用靜態?我總是使用非靜態方法,因爲靜態是有限的很多

+0

我有點困惑。你的第一個例子不是一種方法。這是一個創建匿名內部類的聲明。第二個例子和第一個例子完全不同。 3. Java不允許在方法內部聲明類,所以第二個例子甚至不會編譯(假設方法本身在另一個類中)。 –

+0

@ Code-Apprentice我可以編譯它,在我的代碼中沒有錯誤 –

+0

@ Code-Apprentice您實際上可以在方法中創建類。它的愚蠢,但我看過很多帖子似乎認爲這應該如何AsyncTasks –

回答

0

該解決方案對我來說是:

new HomeActivity().enviarsolicitud(param1,param2); 

最後答案通過@ cricket_007幫助我提高我的代碼。

1

我不認爲這是一個靜態與非靜態的問題。

你的問題是何時寫/使用AsyncTask。如果您使用的是HTTP方法,我的建議可能會切換到Volley或OkHttp,但是如果您想繼續這個路徑,請繼續閱讀。

做一個接口

public interface StringCallback { 
    void onResponse(String result); 
} 

而且回調的結果添加一個參數來sendPostRequest接受的POST響應。

private void enviarsolicitud(final String idadder, final String idadded) { 

    HashMap<String,String> dades = new HashMap<>(); 
    dades.put("idadder",params[0]); 
    dades.put("idadded",params[1]); 
    RegisterUserClass ruc = new RegisterUserClass(); 

    ruc.sendPostRequest("http://www.myurl.net/friend.php",dades,new StringCallback() { 
     @Override 
     public void onResponse(String response) { 
      // Continue with UI logic here 
     } 
    }); 

    // Can't use HTTP response here 
} 

而對於sendPostRequest,您使用的AsyncTask,或者你想和「回傳」的迴應,當它返回任何HTTP框架。

public void sendPostRequest(final String url, final HashMap<String, String> params, final StringCallback callback) { 
    new AsyncTask<String, Void, String>() { 

     @Override 
     public String doInBackground(String... params) { 
      // TODO: HTTP things 
     } 

     @Override 
     protected void onPostExecute(String s) 
     { 
      super.onPostExecute(s); 
      if (callback != null) { 
       callback.onResponse(s); 
      } 
      return; // Done here 
    }.execute(params.get("idadder"), params.get("idadded")); 
} 
+0

我會盡力,謝謝! –

+0

是的,基本上,這是從這個答案的改編http://stackoverflow.com/questions/12575068/how-to-get-the-result-of-onpostexecute-to-main-activity-because-asynctask-is-一個 –

+0

我不知道你試圖告訴我什麼,但我會建議提取這些參數來分隔變量 –

相關問題