2016-05-14 87 views
0

我想通过HTTP发布从android发送数据到web。但我不知道如何从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

我想先注意一下我在代码中看到的一些事情。

  1. 您正在使用HttpClient和NameValuePairs作为您的文章,这在前一段时间应该会很好,但现在已被弃用。我建议你看一下Okhttp和Retrofit,因为它们会让你的生活在网络调用方面变得更容易,并将你的代码分离到不同的层次上,这样单元测试就更容易了。

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

  • 在你doInBackground功能,你可以将这个网络呼叫,但随后被返回null。尝试将AsyncTask的返回类型更改为类似自定义对象的类型,该对象持有对您期望的响应的引用,或者如果您在Android中遵循Observable模式,则可以使此A LOT更清晰。但是,这是一个学习曲线。为了您的参考,这里是一个关于RxJava的视频,您可能会发现它有用。
  • https://www.youtube.com/watch?v=k3D0cWyNno4

  • 让我们回到为什么我建议你远离的AsyncTask的离开是由于以下困境:
  • AsyncTasks是硬因为它们受到它们开始的环境的约束。因此,如果您在此处执行此任务,则必须在所有生命周期回调中管理您的应用的状态,以确保您的活动的任何状态更改不会对UI产生负面影响。此外,除非你做一个task.get(),它将等待任务返回目标对象,否则AsyncTask是一个失败和遗忘。不过,请不要误解这会如何影响您的应用。例如,如果你改变了屏幕的方向,你将失去后台线程,并且你可能间歇性收到的任何数据都将丢失。而且,除非明确地启动另一个线程,否则此AsyncTask将不会再次执行。听起来像很多工作只是为了确保您的网络正确完成,是吧?

    开发人员对此的一种解决方法是将AsyncTasks绑定到Fragments而不是Activities,以便您可以使用Fragment的setRetainInstance方法来跟踪屏幕的状态。尽管如此,随着您进入更复杂的应用程序状态,并希望在自己的“领域”内管理事物,您可能想要在自己的层中分离与网络相关的逻辑,以便1)可以正确测试它, 2)使你的代码更加清晰,3)让你不必担心管理这么多的状态。

    最后,如果你仍然选择采取的方法,这是很好的顺便说一句,只要确保你替换弃用的HTTP客户端,并从AsyncTask后台方法返回一些东西,以便您可以检索onPostExecute。

    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 
         } 
        }}} 
    

    如果你愿意的话,我会给你加入改造和杰克逊练习。希望这可以让我们了解如何解决您的问题以及如何使其更好的一些见解。我尽力根据我对这些东西的经验进行解释,希望它有帮助!