2016-04-01 11 views
0

Ich entwickle eine Andriod App für den Zugriff auf die Datenbank mit Java-Servlet. Da ich sdk 23 verwende, sind einige frühere Module veraltet, daher verwende ich die URLconnection-Klasse, um eine Verbindung zu Servlet herzustellen. Aber durch Ausführen unter Code funktioniert meine App nicht mehr.Wie verbinde ich ein Servlet mit Android-App mit URLconnection.?

Die App baut auf der Aktivität der Navigationsschublade auf und der untere Code ist in einer Fragmentklasse implementiert. Und ja, ich habe Berechtigungen für das Netzwerk

package com.example.nirmal.gaminghub; 


import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.TextView; 
import android.os.AsyncTask; 
import android.widget.Toast; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.lang.Object; 

public class GameList extends Fragment { 


TextView gm_lst=(TextView)getView().findViewById(R.id.game_list); 
Button show; 
String str ="" ; 

public GameList() { 
    // Required empty public constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    new AsyncTask<String, String, String>() { 
     protected String doInBackground(String... url) { 
      try { 
       URL openUrl = new URL("http://localhost:8080/GamingHub/ShowDataServlet"); 
       HttpURLConnection connection = (HttpURLConnection) openUrl.openConnection(); 
       connection.setDoInput(true); 
       // Toast.makeText(getApplicationContext(),"hello",Toast.LENGTH_LONG).show(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
       String line = ""; 
       StringBuilder getOutput = new StringBuilder(); 
       while ((line = br.readLine()) != null) { 
        getOutput.append(line); 
       } 
       br.close(); 
       str=line; 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return str; 
     } 

     protected void OnPostExecute(String otpt) 
     { 
      gm_lst.setText(otpt); 
     } 
    }.execute(); 
    gm_lst.setText(str); 
    return inflater.inflate(R.layout.fragment_game_list, container, false); 
    } 
} 

unten Code ist für Servlet, die perfekt funktioniert.

package com.gaming_hub; 

import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 


public class ShowDataServlet extends HttpServlet { 


protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException, ClassNotFoundException, SQLException { 
    response.setContentType("text/html;charset=UTF-8"); 
    try (PrintWriter out = response.getWriter()) { 
     Class.forName("com.mysql.jdbc.Driver"); 

     Connection con=DriverManager.getConnection( 
      "jdbc:mysql://localhost:3306/gaming_hub","root",""); 
     String sql="SELECT * from games"; 
     PreparedStatement ps=con.prepareStatement(sql); 
     ResultSet rs=ps.executeQuery(); 

     // DataOutputStream dout=new DataOutputStream(); 
     while(rs.next()) 
     { 
      out.println(rs.getString(1)); 
     } 

    } 
} 


@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    try { 
     processRequest(request, response); 
    } catch (ClassNotFoundException ex) { 
     Logger.getLogger(ShowDataServlet.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (SQLException ex) { 
     Logger.getLogger(ShowDataServlet.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 


@Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    try { 
     processRequest(request, response); 
    } catch (ClassNotFoundException ex) { 
     Logger.getLogger(ShowDataServlet.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (SQLException ex) { 
     Logger.getLogger(ShowDataServlet.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 


@Override 
public String getServletInfo() { 
    return "Short description"; 
}// </editor-fold> 

} 
+0

Was meinst du, es funktioniert nicht mehr? –

+0

Wie erhalten wir ein Pop-up, Leider funktioniert Ihre App nicht mehr –

+0

Wenn dies passiert, wird es eine Stack-Trace in der Debug-Konsole sein. Diese Information ist entscheidend, um zu bestimmen, woher das Problem stammt. –

Antwort

1

Der Stack-Trace würde wahrscheinlich darauf hinweisen, klar, dass das Problem mit der Codezeile ist:

TextView gm_lst=(TextView)getView().findViewById(R.id.game_list); 

Das Problem mit dem Fragment Lebenszyklus zu tun hat. Sie können findViewById() zu diesem Zeitpunkt (Fragment) nicht (erfolgreich) aufrufen und seine Ansichten existieren noch nicht wirklich.

Zum Beispiel die onViewCreated() Methode wäre ein sicherer Ort, um findViewById() anrufen. So könnte man versuchen, so etwas wie:

public class GameList extends Fragment { 


TextView gm_lst; 
Button show; 
String str ="" ; 

public GameList() { 
    // Required empty public constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_game_list, container, false); 
    } 
} 

@Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

    gm_lst = (TextView)getView().findViewById(R.id.game_list); 

    new AsyncTask<String, String, String>() { 
     protected String doInBackground(String... url) { 
      try { 
       URL openUrl = new URL("http://localhost:8080/GamingHub/ShowDataServlet"); 
       HttpURLConnection connection = (HttpURLConnection) openUrl.openConnection(); 
       connection.setDoInput(true); 
       // Toast.makeText(getApplicationContext(),"hello",Toast.LENGTH_LONG).show(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
       String line = ""; 
       StringBuilder getOutput = new StringBuilder(); 
       while ((line = br.readLine()) != null) { 
        getOutput.append(line); 
       } 
       br.close(); 
       str=line; 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return str; 
     } 

     protected void OnPostExecute(String otpt) 
     { 
      gm_lst.setText(otpt); 
     } 
    }.execute(); 
    gm_lst.setText(str); 

    } 

Und dann eine andere Frage ist, dass Sie str = line; zuweisen und nur bekommen, was die letzten br.readLine() zurückgegeben, wenn Sie wahrscheinlich den Inhalt der getOutput wollen.

+0

Danke für die Antwort geben, aber ich habe das auch versucht, konnte aber nicht verbinden. @ MarkusKauppinen –