java - android 在网络上发布数据

标签 java php android http

我正在尝试通过 HTTP post 将数据从 android 发送到网络。但我不知道如何从android接收数据到web。

这是我的 Activity 代码:

    public class Chatit extends Activity {
    Context context = this;
    ChatDbHelper chatDbHelper;
    SQLiteDatabase sqLiteDatabase;
    EditText editText;
    ListView listView;
    Cursor cursor;
    ListDataAdapter listDataAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chatit);

        editText = (EditText)findViewById(R.id.editText3);
        listView = (ListView)findViewById(R.id.listView);
        listDataAdapter = new ListDataAdapter(getApplicationContext(),R.layout.row_layout);
        listView.setAdapter(listDataAdapter);


        chatDbHelper = new ChatDbHelper(context);
        sqLiteDatabase = chatDbHelper.getReadableDatabase();
        cursor = chatDbHelper.getChat(sqLiteDatabase);
        if (cursor.moveToFirst()) {
            do {
                String name;

                name = cursor.getString(0);

                DataProvider dataProvider = new DataProvider(name);
                listDataAdapter.add(dataProvider);

            } while (cursor.moveToNext());
        }
    }

  /*  public void send(View view){
        String chat = editText.getText().toString();

        chatDbHelper = new ChatDbHelper(context);
        sqLiteDatabase = chatDbHelper.getWritableDatabase();
        chatDbHelper.addChat(chat,sqLiteDatabase);

        Toast.makeText(getBaseContext(), "Message sent", Toast.LENGTH_SHORT).show();
        chatDbHelper.close();
        Intent intent = new Intent(this,Chatit.class);
        startActivity(intent);
    } */



    public void send(View view) {
        // TODO Auto-generated method stub
        if(editText.getText().toString().length()<1){

            // out of range
            Toast.makeText(this, "please enter something", Toast.LENGTH_LONG).show();
        }else{
            String chat = editText.getText().toString();

            chatDbHelper = new ChatDbHelper(context);
            sqLiteDatabase = chatDbHelper.getWritableDatabase();
            chatDbHelper.addChat(chat,sqLiteDatabase);

            Toast.makeText(getBaseContext(), "Message sent", Toast.LENGTH_SHORT).show();
            chatDbHelper.close();
            Intent intent = new Intent(this,Chatit.class);
            startActivity(intent);

           // pb.setVisibility(View.VISIBLE);
            new MyAsyncTask().execute(editText.getText().toString());
        }


    }

    private class MyAsyncTask extends AsyncTask<String, Integer, Double> {

        @Override
        protected Double doInBackground(String... params) {
            // TODO Auto-generated method stub
            postData(params[0]);
            return null;
        }

        protected void onPostExecute(Double result){
          //  pb.setVisibility(View.GONE);
           // Toast.makeText(getApplicationContext(), "command sent", Toast.LENGTH_LONG).show();
        }
       // protected void onProgressUpdate(Integer... progress){
        //    pb.setProgress(progress[0]);
       // }

        public void postData(String valueIWantToSend) {
            // Create a new HttpClient and Post Header
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://somewebsite.com/receiver.php");

            try {
                // Add your data
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("myHttpData", valueIWantToSend));
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                // Execute HTTP Post Request
                HttpResponse response = httpclient.execute(httppost);

            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
            } catch (IOException e) {
                // TODO Auto-generated catch block
            }
        }}}

请告诉我:

我做得对还是错?

如何从 Android 接收数据到网络?

最佳答案

我想首先指出我在您的代码中看到的一些内容。

  1. 您在帖子中使用了 HttpClient 和 NameValuePairs,这在不久前还可以,但现在已弃用。我建议您查看 Okhttp 和 Retrofit,因为它们将使您的网络调用变得更加轻松,并将代码分层,以便单元测试更容易。

您可以在这里找到 Okhttp:https://github.com/square/okhttp

  • 在 doInBackground 函数中,您正在进行网络调用,但随后返回 null。尝试将 AsyncTask 的返回类型更改为自定义对象之类的内容,该对象包含对您期望的响应外观的引用,或者如果您遵循 Android 中的 Observable 模式,则可以使这变得更加清晰。然而,这是一个学习曲线。作为您的引用,这里有一个关于 RxJava 的视频,您可能会发现它对您的后续工作很有用。
  • https://www.youtube.com/watch?v=k3D0cWyNno4

  • 回到我为什么建议您远离 AsyncTask 的原因是由于以下困境:
  • 异步任务很难控制,因为它们绑定(bind)到它们启动的上下文。因此,如果您在此处执行此任务,则必须在所有生命周期回调中管理应用程序的状态,以确保 Activity 的任何状态更改不会对 UI 产生负面影响。此外,AsyncTask 是一劳永逸的,除非您执行 task.get(),它将等待任务返回预期对象。但是,请不要误会这对您的应用程序有何影响。例如,如果您更改屏幕方向,您将丢失后台线程,并且您可能间歇性接收的任何数据也将丢失。并且,除非您明确触发另一个线程,否则此 AsyncTask 将不会再次执行。听起来需要做很多工作才能确保您的网络正确完成,是吗?

    开发人员对此采取的一种解决方法是使 AsyncTasks 绑定(bind)到 Fragment 而不是 Activity,以便您可以使用 Fragment 的 setRetainInstance 方法来跟踪屏幕的状态。尽管如此,当您发展到更复杂的应用程序状态并希望在自己的“领域”内管理事物时,可以这么说,您将希望在自己的层中分离与网络相关的逻辑,以便 1)可以正确测试它, 2) 让您的代码更简洁,3) 让您不必担心管理如此多的状态。

    最后,如果您仍然选择采用您所采用的方法(顺便说一句,这很好),只需确保替换已弃用的 HTTP 客户端并从 AsyncTask 后台方法返回一些内容,以便您可以在 PostExecute 时检索它。

        private class MyAsyncTask extends AsyncTask<String, Integer, Object> {
    
        @Override
        protected Object doInBackground(String... params) {
            // TODO Auto-generated method stub
            // I'd advise you to make the return type an Object, as whatever
            // the server returns will be easier to manage that way.
            // I placed a generic object here for now, create a custom one.
            Object response = postData(params[0]);
            return response;
        }
    
        protected void onPostExecute(Double result){
    
          //  pb.setVisibility(View.GONE);
           // Toast.makeText(getApplicationContext(), "command sent", Toast.LENGTH_LONG).show();
        }
    
    
        public void postData(String valueIWantToSend) {
            // Create a new HttpClient and Post Header
            public static final MediaType JSON
                = MediaType.parse("application/json; charset=utf-8");
    
            OkHttpClient client = new OkHttpClient();
    
            try {
                RequestBody body = RequestBody.create(JSON, valueIWantToSend);
                  Request request = new Request.Builder()
                      .url("http://somewebsite.com/receiver.php")
                      .post(body)
                      .build();
                  Response response = client.newCall(request).execute();
                  return response.body().string();
            } catch (Exception e) {
                // do something
            }
        }}}
    

    如果您愿意的话,我会将整合改造和 jackson 作为您的练习。希望这对如何解决您的问题有所启发,并对如何改善问题有一些见解。我尽力根据我在这方面的经验来解释,希望它有所帮助!

    关于java - android 在网络上发布数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37225124/

    相关文章:

    android - 更改android中编辑文本框的外观

    java - 如何为我的应用程序使用 geoserver 的用户管理

    java - 如何清空特定的字符数组位置

    php - 如何在html上为数字添加不同的样式?

    javascript - 如何使用 jquery ajax 向 php 页面发送异步请求

    android - 在 Android 的 ImageButton 上设置位图背景

    java - 如何将所有值设置回原始起始值

    java - 什么是适合 Hibernate 初学者的最佳电子书?

    javascript - Node.js 或 Express.js 是否是像 PHP 一样的服务器端语言

    java - 无法创建监听器 - 传递参数时遇到问题