2016-04-01 3 views
0

Я разрабатываю приложение Andriod для доступа к базе данных с помощью java-сервлета. Поскольку я использую sdk 23, некоторые предыдущие модули устарели, поэтому я использую класс URLconnection для подключения к сервлету. Но, работая под кодом, мое приложение перестает работать.Как подключить сервлет к Android-приложению, используя URL-соединение.?

Приложение основано на активности переносного ящика, а ниже код реализован в одном классе фрагментов. И да, я установил разрешения для сети

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

Ниже приведен код для сервлета, который отлично работает.

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

Что значит прекратить работу? –

+0

Как, мы получаем всплывающее окно, к сожалению, ваше приложение перестало работать –

+0

Если это произойдет, в консоли отладки будет трассировка стека. Эта информация имеет решающее значение для определения того, откуда возникла проблема. –

ответ

1

Трассировка стека, вероятно, ясно указывают на то, что проблема с кодом строки:

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

Проблема связана с Fragment жизненного цикла. Вы просто не можете (успешно) позвонить findViewById() в этот момент как Fragment, и его взгляды пока не существуют.

Например, метод onViewCreated() был бы безопасным местом для звонка findViewById(). Таким образом, вы можете попробовать что-то вроде:

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); 

    } 

А потом отдельный вопрос в том, что вы назначаете str = line; и получить только то, что последний br.readLine() возвращается, когда вы, вероятно, хотите содержимое getOutput.

+0

Спасибо, что ответили, но я тоже пробовал, но не смог подключиться. @ MarkusKauppinen –

Смежные вопросы