我是Android开发和Java的新手。目前,我有一个应用程序,它使用一些参数发出基本的HTTP POST请求。
我想知道是否可以制作2个只提出相同请求但参数不同的活动,不必在2个活动中粘贴相同的方法。
示例:我有两个屏幕,相同,当我按下每个屏幕上的按钮时,它会发送我使用不同参数制作的发布请求。
PS:我的要求可能不够具体,所以请向我询问详细信息或一些代码(但我认为这里没有必要)。编辑:我认为我严厉地解释了我的想法:D 我有一个带有静态函数的类:
公共类MyHttpPost {
public static String performPostCall(String requestURL, HashMap<String, String> postDataParams) throws IOException {
InputStream is = null;
int len = 500;
URL url;
try {
url = new URL(requestURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
writer.write(getPostDataString(postDataParams));
writer.flush();
writer.close();
os.close();
is = conn.getInputStream();
return readIt(is, len);
} finally {
if (is != null) {
is.close();
}
}
}
public static String readIt(InputStream stream, int len) throws IOException {
Reader reader = new InputStreamReader(stream, "UTF-8");
char[] buffer = new char[len];
reader.read(buffer);
return new String(buffer);
}
private static String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException {
StringBuilder result = new StringBuilder();
boolean first = true;
for( Map.Entry<String, String> entry : params.entrySet() ) {
if (first)
first = false;
else
result.append("&");
result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
result.append("=");
result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
}
return result.toString();
}
}
和两项活动:
公共类TestPost扩展了AppCompatActivity {
public final static String EXTRA_MESSAGE = "MESSAGE";
private TextView myView;
private EditText urlText;
HashMap<String, String> postDataParams;
WebView webview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_post);
myView = (TextView)findViewById(R.id.myText);
urlText = (EditText)findViewById(R.id.myUrl);
postDataParams = new HashMap<>();
postDataParams.put("firstParam", "1234");
postDataParams.put("secondParam", "qwerty");
webview = new WebView(this);
webview = (WebView) findViewById(R.id.myWebView);
}
public void sendMessage(View view) {
Intent intent = new Intent(this, Home.class);
TextView editTextview = (TextView) findViewById(R.id.myText);
String message = editTextview.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
protected class DownloadWebpageTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
// params comes from the execute() call: params[0] is the url.
try {
return MyHttpPost.performPostCall(urls[0], postDataParams);
} catch (IOException e) {
return getResources().getString(R.string.bad_url);
}
}
// onPostExecute displays the results of the AsyncTask.
@Override
protected void onPostExecute(String result) {
myView.setText(result);
webview.loadData(result, "text/html", null);
}
}
// When user clicks button, calls AsyncTask.
// Before attempting to fetch the URL, makes sure that there is a network connection.
public void myClickHandler(View view) {
// Gets the URL from the UI's text field.
String stringUrl = urlText.getText().toString();
ConnectivityManager connMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
new DownloadWebpageTask().execute(stringUrl);
} else {
myView.setText("No network connection available.");
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_test_post, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
和
public class OtherClass扩展了TestPost {
private TextView myView;
private EditText urlText;
HashMap<String, String> postDataParams;
WebView webview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_post);
myView = (TextView)findViewById(R.id.myText);
urlText = (EditText)findViewById(R.id.myUrl);
myView.setText("coucou");
postDataParams = new HashMap<>();
postDataParams.put("firstParam", "9876");
postDataParams.put("secondParam", "ytreza");
webview = new WebView(this);
webview = (WebView) findViewById(R.id.myWebView);
}
protected class DownloadWebpageTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
// params comes from the execute() call: params[0] is the url.
try {
return MyHttpPost.performPostCall(urls[0], postDataParams);
} catch (IOException e) {
return getResources().getString(R.string.bad_url);
}
}
// onPostExecute displays the results of the AsyncTask.
@Override
protected void onPostExecute(String result) {
myView.setText(result);
webview.loadData(result, "text/html", null);
}
}
public void myClickHandler(View view) {
// Gets the URL from the UI's text field.
String stringUrl = urlText.getText().toString();
ConnectivityManager connMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
new DownloadWebpageTask().execute(stringUrl);
} else {
myView.setText("No network connection available.");
}
}
}
如你所见,在第二节课中,为了发送不同的参数,我必须重新定义这些功能,我想知道它是否是唯一的选择(如果它不坏的话)这样做)。 就像我只能在两个班级中定义参数并提出请求一样。
答案 0 :(得分:0)
如果我理解你,你可以这样做,如果你创建一个utils类,你可以粘贴方法(公共和你可以传递的参数),这两个活动相同,然后从活动中调用它们像这样:UtilsClass.sendPOSTRequest(myparam1, myparam2);
答案 1 :(得分:0)
您应该创建一个pandas.read_csv
类,其中包含执行HTTP POST的方法。该方法采用您的请求中不同的参数。然后创建此类的实例并将其传递给两个活动。
您的新NetworkService
应包含所有与网络相关的方法以获得更好的架构,请参阅Separation of Concerns。
答案 2 :(得分:0)
这需要一个NetworkUtils类!这将是一个您应该使用相同HTTP POST方法(您要在两个活动中定义的方法)静态使用的类,并调用公共静态方法。例如:
public class NetworkUtils{
public static HttpResponse postData(String param1, String param2) {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php");
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("id", param1));
nameValuePairs.add(new BasicNameValuePair("stringdata", param2));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request, return response
return httpclient.execute(httppost);
} catch (ClientProtocolException e) {
e.printStacktrace();
}catch (IOException e) {
e.printStacktrace();
}
return null;
}
}
如果网络请求出现问题,请检查是否为空。除此之外,这只是您的解决方案的一个示例。 (以节省额外的代码!)
注意:必须在AsyncThread或Handler中调用此方法,因为在发生这种情况时您将阻止UI线程。
答案 3 :(得分:0)
创建一个全局类并定义你的http方法/方法并使它们保持静态!从任何地方使用它并根据需要传递参数