簡體   English   中英

Android-通過按鈕上的AsyncTask發送HTTP請求 代表問題

[英]Android - Send HTTP Request with AsyncTask on Button Click | Problems with delegate

我將要編寫一個小應用程序。 單擊按鈕后,我將在自定義異步任務類中發送一個http請求。 我想將此值寫在EditText字段和ListView中作為項目。 我現在的問題是我想將請求的值返回給主線程以進一步處理它。 我四處搜尋,發現了一個帶有接口的方法。 這是我的asynctask類:

    public class Request extends AsyncTask<String,Void,String> {
    public AsyncResponse delegate=null;
    private MainActivity mAct;
    public Request(MainActivity mainActivity){
        this.mAct = mainActivity;
    }
    @Override
    protected String doInBackground(String... url){
        String returnString = "";
        try {
            URL u = new URL(url[0]);
            final HttpURLConnection connection = (HttpURLConnection)u.openConnection();
            BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
            byte[] content = new byte[1024];
            int bytesRead = 0;
            String strContent = "";
            while((bytesRead = bis.read(content)) != -1){
                strContent += new String(content,0,bytesRead);
            }
            returnString = strContent;
        } catch (Exception e){

        } finally {
            return returnString;
        }
    }
    protected void onPostExecute(String result){
        delegate.processFinish(result);
    }
}

這是我的MainActivity:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final Button btnSend = (Button)findViewById(R.id.btnSendMessage);
    final ListView lv = (ListView)findViewById(R.id.treeView);
    final EditText editText = (EditText)findViewById(R.id.txtReqID);

    final MainActivity ma = this;
    final ArrayList<String> arrList = new ArrayList<String>();
    final ArrayAdapter<String> arrAdapter = new ArrayAdapter<String>(getApplicationContext(),R.layout.simple_list_item_1,arrList);

    btnSend.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){
            String t = new String("http://myhttprequest");
            Request r = new Request(ma);
            public void onCreate(Bundle savedInstanceState){
                r.delegate = this;
            }

            editText.setText(returnValue);
            lv.setAdapter(arrAdapter);
            arrList.add(returnValue);
            arrAdapter.notifyDataSetChanged();
        }
    });
}
public interface AsyncResponse{
    void processFinish(String output);
}

問題在於我必須將每個變量都聲明為final,因為我在函數中訪問了它們。 我現在對我的代碼不太滿意,我也不知道如何進行這項工作。 很感謝任何形式的幫助。

最好的祝福

嘗試這種方式:

 btnSend.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){
           String t = new String("http://myhttprequest");
           Request r = new Request(ma){
               protected void onPostExecute(String result){
                   editText.setText(result);
                   lv.setAdapter(result);
                   arrList.add(result);
                   arrAdapter.result();
               }
          };

     }
});

你應該做什么我很簡單。

  1. 創建一個將“ delegate”作為參數1.1的AsyncTask構造函數。如果“ delegate”是一個Activity(在您的情況下),只需確保將其保留在WeakReference中(以避免內存泄漏)即可。
  2. 您對http感興趣嗎
  3. 當您想分派回調時,只需使用“ delegate”參數(檢查是否為空-因為它是一個WeakReference)。

干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM