2016-05-14 8 views
0

Ich versuche, Daten von Android zu Web über HTTP-Post zu senden. Aber ich weiß nicht, wie man Daten von android zum Netz empfängt.Android-Post-Daten im Web

Hier ist mein Aktivitätscode:

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

Bitte sagen Sie mir:

Bin ich richtig tun oder nicht?

Wie kann ich Daten von Android zu Web erhalten?

Antwort

1

Ich möchte zuerst mit ein paar Dinge, die ich in Ihrem Code sehe beginnen.

  1. Sie verwenden HttpClient mit NameValuePairs für Ihren Beitrag, was vor einiger Zeit in Ordnung gewesen wäre, aber jetzt veraltet ist. Ich rate Ihnen, sich Okhttp und Retrofit anzuschauen, da diese Ihr Leben in Bezug auf Netzwerkanrufe viel einfacher machen und Ihren Code in Schichten unterteilen, so dass Komponententests einfacher sind.

Sie können Okhttp finden Sie hier: https://github.com/square/okhttp

  1. In Ihrer doInBackground Funktion werden Sie den Netzanruf zu machen, aber dann null zurückkehren. Versuchen Sie, den Rückgabetyp von AsyncTask in ein benutzerdefiniertes Objekt zu ändern, das einen Verweis auf die erwartete Antwort enthält. Wenn Sie dem Observable-Muster in Android folgen, können Sie A LOT sauberer gestalten. Es ist jedoch ein bisschen eine Lernkurve. Zu Ihrer Information, hier ist ein Video von RxJava, das Sie vielleicht nützlich finden könnten.

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

  1. Gehen wir zurück zu warum ich Ihnen raten würde von AsyncTask ist zu bleiben weg ist aufgrund des folgenden Dilemma:

AsyncTasks schwer zu kontrollieren, weil sie an den Kontext gebunden sind, in dem sie gestartet werden. Wenn Sie diese Aufgabe hier ausführen, müssen Sie den Status Ihrer App in allen Lebenszyklus-Callbacks verwalten, um sicherzustellen, dass sich der Status Ihrer Änderungen nicht negativ auf die Benutzeroberfläche auswirkt. Darüber hinaus ist die AsyncTask ein Feuer und vergessen, es sei denn, Sie tun eine task.get(), die darauf wartet, dass die Aufgabe das beabsichtigte Objekt zurückgibt. Machen Sie sich jedoch keine Gedanken darüber, wie sich dies auf Ihre App auswirkt. Wenn Sie beispielsweise die Ausrichtung Ihres Bildschirms ändern, verlieren Sie den Hintergrund-Thread und auch alle Daten, die Sie intermittierend erhalten haben, gehen verloren. UND, diese AsyncTask wird nicht erneut ausgeführt, außer Sie explizit einen anderen Thread auslösen. Klingt nach einer Menge Arbeit, nur um sicherzustellen, dass Ihr Netzwerk richtig funktioniert, nicht wahr?

Eine Umgehungslösung für Entwickler besteht darin, dass AsyncTasks an Fragmente anstatt an Aktivitäten gebunden werden, damit Sie mit der Methode setRetainInstance des Fragments den Zustand des Bildschirms verfolgen können. Wenn Sie jedoch in komplexere App-Zustände hineinwachsen und die Dinge sozusagen in ihrem eigenen "Bereich" verwalten möchten, sollten Sie die Logik, die das Netzwerk betrifft, in ihrer eigenen Ebene trennen, damit sie 1) richtig getestet werden kann. 2) macht Ihren Code sauberer und 3) ermöglicht es Ihnen, sich nicht um die Verwaltung so vieler Zustände kümmern zu müssen. Wenn Sie sich immer noch dafür entscheiden, den von Ihnen gewählten Ansatz zu wählen, der übrigens gut ist, stellen Sie sicher, dass Sie den veralteten HTTP-Client ersetzen und etwas von Ihrer AsyncTask-Hintergrundmethode zurückgeben, damit Sie ihn aufPostExecute abrufen können.

Ich lasse mit Retrofit und Jackson als Übung für Sie, wenn Sie das tun möchten. Hoffentlich gibt dies Aufschluss darüber, wie Sie Ihr Problem lösen können und wie Sie es verbessern können. Ich habe versucht, mein Bestes zu geben, basierend auf der Erfahrung, die ich mit diesem Zeug hatte, hoffe, es hilft!