Android - 将参数传递给 Android 应用程序中的 RESTful URL

Posted

技术标签:

【中文标题】Android - 将参数传递给 Android 应用程序中的 RESTful URL【英文标题】:Android - Passing Params to the RESTful URL in Android app 【发布时间】:2015-11-11 15:11:49 【问题描述】:

我正在开发一个涉及传递参数的android应用程序。我想将参数传递给android中的url。

如何使用 EditText 字段将参数传递到 Android 应用程序中的 RESTful URL。也给我在 android 中 get 和 post 方法 webservice 调用和传递参数的基本示例。

MainActivity.java:

        public class MainActivity extends Activity implements OnClickListener 
        @Override
        public void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            findViewById(R.id.my_button).setOnClickListener(this);
        
        @Override
        public void onClick(View arg0) 
            Button b = (Button)findViewById(R.id.my_button);
            b.setClickable(false);
            new LongRunningGetIO().execute();
        
        private class LongRunningGetIO extends AsyncTask <Void, Void, String> 
            protected String getASCIIContentFromEntity(HttpEntity entity) throws IllegalStateException, IOException 
               InputStream in = entity.getContent();
                 StringBuffer out = new StringBuffer();
                 int n = 1;
                 while (n>0) 
                     byte[] b = new byte[4096];
                     n =  in.read(b);
                     if (n>0) out.append(new String(b, 0, n));
                 
                 return out.toString();
            

            @Override
            protected String doInBackground(Void... params) 
                 HttpClient httpClient = new DefaultHttpClient();
                 HttpContext localContext = new BasicHttpContext();
                 String st1=null;
                 String st2=null;

                 EditText et1 = (EditText)findViewById(R.id.editText1);

                 EditText et2 = (EditText)findViewById(R.id.editText2);

                 st1= et1.getText().toString();
                 st2= et2.getText().toString();
                HttpGet httpGet = new HttpGet("http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate?FromCurrency="+st1+"&ToCurrency="+st2);
                 Log.d("url", httpGet.toString());
                 Log.d("et1", et1.toString());
                 Log.d("et2", et2.toString());
                String text = null;
                 try 
                       HttpResponse response = httpClient.execute(httpGet, localContext);
                       HttpEntity entity = response.getEntity();
                       text = getASCIIContentFromEntity(entity);
                  catch (Exception e) 
                     return e.getLocalizedMessage();
                 
                 return text;
               

            protected void onPostExecute(String results) 
                if (results!=null) 
                    EditText et = (EditText)findViewById(R.id.my_edit);
                    et.setText(results);
                
                Button b = (Button)findViewById(R.id.my_button);
                b.setClickable(true);
            
        
        

    activity_main.xml:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_
        android:orientation="vertical" >

         <TextView
            android:layout_
            android:layout_
            android:text="Http GET Demo"/>

        <EditText
            android:id="@+id/editText1"
            android:layout_
            android:layout_
            android:ems="10" >

            <requestFocus />
        </EditText>



        <EditText
            android:id="@+id/editText2"
            android:layout_
            android:layout_
            android:ems="10" />

        <Button 
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:text="GET"
            android:id="@+id/my_button"/>
        <EditText 
            android:layout_margin="20dip"
            android:layout_
            android:layout_
            android:minLines="15"
            android:maxLines="15"
            android:textSize="12sp"
            android:editable="false"
            android:id="@+id/my_edit"/>
    </LinearLayout>

【问题讨论】:

我收到错误,不幸停止了。 如该答案所述,您无法访问 doInBackground 中的 UI 元素。使用 onPreExecute。 @OzgurGUL。但是上面的代码对我有用。早些时候我把它写成 st1= et1.toString(); st2= et2.toString();不幸的是,我得到了错误停止。但现在将其更改为 st1= et1.getText().toString(); st2= et2.getText().toString();它对我有用。 【参考方案1】:

doInBackground 中有以下几行:

....
st1= et1.getText().toString();
st2= et2.getText().toString();

导致问题因为et1et1 是UI 元素,所以我们只能从UI 线程而不是从doInBackground 中用于在单独线程中执行任务的任何后台线程访问这些视图。

使用onPreExecute方法从EditText获取数据:

String st1=null;
@Override
    protected void onPreExecute() 
        super.onPreExecute();
        EditText et1 = (EditText)findViewById(R.id.editText1);
        st1= et1.getText().toString();
        // do same for other
     

现在在doInBackground 中使用st1 字符串来获取用户输入文本。

【讨论】:

我的代码运行良好。之前我把它写成 st1= et1.toString(); st2= et2.toString();不幸的是,我得到了错误停止。但现在将其更改为 st1= et1.getText().toString(); st2= et2.getText().toString();它对我有用。

以上是关于Android - 将参数传递给 Android 应用程序中的 RESTful URL的主要内容,如果未能解决你的问题,请参考以下文章

Android 数据绑定将参数传递给 onClick 方法

如何将变量/参数传递给android视图方法

从 android 或 iOS 将参数传递给颤振模块

如何将不同的参数传递给片段 [导航] Android

Android:如何将参数传递给 AsyncTask 的 onPreExecute()?

如何使用底部导航视图和 Android 导航组件将参数传递给片段?