2016-08-30 40 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); 
} 

的问题是,我必须每一个变量声明为final,因为我在函数内部存取权限它们。我现在对我的代码感到不高兴,我也不知道如何让这项工作。很感谢任何形式的帮助。

致以问候

回答

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. 创建的AsyncTask构造函数“委派”为PARAM 1.1情况下,“委托”是一种活动(这是你的情况),只要确保它保持在WeakReference的(以避免内存泄漏)
  2. 你是否与http
  3. 当你想分派回调,只需使用你的“委托”参数(检查为空 - 因为它是一个WeakReference)。

干杯!

+0

我不明白这是如何用'setOnClickListener'内的代码可以解决问题。如果你能给我一个简短的代码示例,我会非常感激。 – binaryBigInt