2016-05-14 104 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 
         } 
        }}} 
    

    如果你願意的話,我會給你加入改造和傑克遜練習。希望這可以讓我們瞭解如何解決您的問題以及如何使其更好的一些見解。我盡力根據我對這些東西的經驗進行解釋,希望它有幫助!