2016-08-30 9 views
0

私は小さなアプリケーションを書くつもりです。ボタンをクリックすると、カスタム非同期タスククラスでhttpリクエストが送信されます。この値をEditTextフィールドとListViewアイテムとして書きたいと思います。今私の問題は、私はそれをさらに処理するために、メインスレッドに要求の値を返すしたいです。私は周りを検索し、インターフェイスを持つメソッドを見つけました。これは私のasynctaskクラスです:Android - ボタンでAsyncTaskを使用してHTTPリクエストを送信する|デリゲートの問題

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

問題は、私は関数内でそれらをアクセスもあるため、最終的なとして、すべての変数を宣言しなければならないということです。私は今、私のコードにはとても満足していませんし、私はこの仕事をどのようにすることもできません。どんな助力も非常に感謝しています。

よろしくお願いします。

答えて

1

は、この方法を試してみてください:

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(); 
       } 
      }; 

    } 
}); 
0

あなたはすごく簡単です。

  1. 「デリゲートは、」アクティビティである場合のparam 1.1として「デリゲート」を取るAsyncTaskのコンストラクタを作成します(それはあなたのケースである)ちょうど(メモリリークを避けるために)弱い参照に開催だことを確認してください
  2. あなたはhttpでの作業を行いますか
  3. コールバックをディスパッチするには、「代理人」パラメータを使用します(nullをチェックする - WeakReferenceであるため)。

乾杯!

+0

私は、これは 'setOnClickListener'内部コードの問題を修正する方法が表示されません。短いコード例を教えていただけたら本当にありがたいです。 – binaryBigInt

関連する問題