android在网络上发布数据


android post data on web

我正试图通过HTTPpost将数据从android发送到web。但我不知道如何从安卓系统接收数据到网络。

这是我的活动代码:

    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接收数据到web?

我想首先注意一下我在代码中看到的一些内容。

  1. 您的文章使用的是带有NameValuePairs的HttpClient,这在不久前还可以,但现在已被弃用。我建议你参考Okhttp和Reform,因为它们会让你的生活在网络调用方面变得更轻松,并将你的代码分为多个层,这样单元测试就更容易了

您可以在此处找到Okhttp:https://github.com/square/okhttp

  1. 在doInBackground函数中,您正在进行网络调用,但随后返回null。尝试将AsyncTask的返回类型更改为类似于自定义对象的类型,该对象包含对您期望的响应的引用,或者如果您在android中遵循Observable模式,则可以使其更干净。然而,这有点像一条学习曲线。这里有一个关于RxJava的视频供您参考,您可能会发现它在前进中很有用

https://www.youtube.com/watch?v=k3D0cWyNno4

  1. 回到我建议您远离AsyncTask的原因是由于以下困境:

AsyncTasks很难控制,因为它们绑定到启动它们的上下文。所以,若您在这里执行此任务,您必须在所有生命周期回调中管理应用程序的状态,以确保"活动"的任何更改状态都不会对UI产生负面影响。此外,除非执行task.get(),否则AsyncTask是一个"一走了之"的任务,它将等待任务返回预期对象。但是,请不要搞错这会对您的应用程序产生什么影响。例如,如果你改变屏幕的方向,你将失去背景线程,你可能间歇性收到的任何数据也将丢失。AND,除非显式启动另一个线程,否则此AsyncTask将不会再次执行。听起来要做很多工作来确保你的人际关系网做得很好,是吗?

开发人员为此做的一个变通方法是将AsyncTasks绑定到Fragments而不是Activities,这样您就可以使用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
        }
    }}}

如果你愿意的话,我会把改装和杰克逊作为一个练习留给你。希望这能让你了解如何解决你的问题,以及如何让问题变得更好。我尽力根据我对这些东西的经验进行解释,希望它能有所帮助!