Oluşturmaya çalıştığım, veritabanı bağlantısı olan bir web uygulama ve iletiş kurduğu bir Android uygulaması var.


Bu iki uygulamada yapmaya çalıştığım sıralı işler:

  1. Kullanıcıdan idnumber ve password olmak üzere iki bilgi alıp JSON ile web uygulamasına bir post request göndermek
  2. Gönderilen request mesajını web uygulama içerisinde çözümleyip, veritabanında sorgulamak
  3. Eğer sorgulamada bir eşleşme sağlanırsa değeri true olan yeni bir JSON nesnesi oluşturup cevap (response) olarak ikinci aktiviteyi başlatması için Android uygulamasına göndermek
  4. Eğer herhangi bir eşleşme bulunamazsa, değeri false olan başka bir JSON nesnesi oluşturup bir toast nesnesi ile böyle bir kullanıcının bulunmadığını söyleyen bir mesaj çıkararak herhangi bir intent başlatmadan kullanıcıdan doğru bilgileri girmesini beklemek

Sunucu tarafından android uygulamasına gönderilen cevaba kadar tüm süreç doğru bir şekilde ilerliyor. Ama bazı tuhaf mesajların yanısıra gönderilen cevap true yada false olması dikkate alınmaksızın ikinci aktivite başlatılıyor.


--------------------------Sunucu tarafında bulunan Servlet sınıfı----------------------------------------

import jdbc.model.User;

public class GetAndroidRequest extends HttpServlet {

public GetAndroidRequest() {
    super();
}

private static final long serialVersionUID = 1L;

List<Users> users = new ArrayList<Users>();

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException 
{   
    doPost(request, response);
    ObjectMapper mapper = new ObjectMapper();
    response.setContentType("application/json");
    mapper.writeValue(response.getOutputStream(), users);
}

//  doPost(): receives JSON data, parse it, map it and send back as JSON
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException 
{
    // receiving JSON data from request
    BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
    String user_credentials = "";
    user_credentials = br.readLine();
    ObjectMapper mapper = new ObjectMapper();
    Users user = mapper.readValue(user_credentials, Users.class);
    response.setContentType("application/json");
    users.add(user);

    int listSize = users.size() - 1;

    String user_idnumber = users.get(listSize).getIdnumber();
    String user_password = users.get(listSize).getPassword();

    System.out.println("list: " + users);
    System.out.println("list size: " + users.size());
    System.out.println("user_idnumber: " + user_idnumber);
    System.out.println("user_password: " + user_password);

    Boolean result;
    result = check(user_idnumber, user_password).get("server_result").getAsBoolean();
    System.out.println("124: server_result: "+result);

    if (result == true) {
        mapper.writeValueAsString("accepted");
        System.out.println("accepted");

        mapper.writeValue(response.getOutputStream(), result);

    } else if (result == false) {
        mapper.writeValueAsString("rejected");
        System.out.println("rejected");

        mapper.writeValue(response.getOutputStream(), result);
    }
}

private static JsonObject check(String idNumber, String Password) {

    try {

        UsersDAO user_query = new UsersDAO();
        Users user = user_query.getUser(idNumber, Password);

        JsonObject resp = new JsonObject();
        Gson resp_in_gson = new GsonBuilder().create();

        if (user != null) {
            resp.addProperty("server_result", Boolean.TRUE);
            resp_in_gson.toJson(resp);
            System.out.println(resp);
            return resp;
        } else if (user == null) {
            resp.addProperty("server_result", Boolean.FALSE);
            resp_in_gson.toJson(resp);
            System.out.println(resp);
            return resp;
        } else {
            System.out.println("No such User with ID number : " + idNumber);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    System.out.println("noting");
    return null;
 }
}

-----------------------------------------İstemci tarafında bulunan LoginActivity aktivitesi----------------------------------------


import app.util.User;

public class LoginActivity extends Activity implements OnClickListener
{

   EditText txt_id;
   EditText txt_password;
   Button buttonPost;

   User user;

   @Override
   protected void onCreate(Bundle savedInstanceState)
   {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_login);

      // getting reference to the views
      txt_id = (EditText) findViewById(R.id.edittext_idnumber);
      txt_password = (EditText) findViewById(R.id.edittext_password);
      buttonPost = (Button) findViewById(R.id.button_Post);

      // add click listener to Button "POST"
      buttonPost.setOnClickListener(this);
   }

   public String POST(String url, User user)
   {
      InputStream inputStream;
      String result = "";
      try {
        // 1. create HttpClient
        HttpClient httpclient = new DefaultHttpClient();

        // 2. make POST request to the given URL
        HttpPost httpPost = new HttpPost(url);

        String json;

        // 3. build jsonObject -
        JSONObject jsonObject = new JSONObject();
        jsonObject.accumulate("idnumber", user.getIdnumber());
        jsonObject.accumulate("password", user.getPassword());

        // 4. convert JSONObject to JSON to String
        json = jsonObject.toString();

        // 5. set json to StringEntity
        StringEntity se = new StringEntity(json);

        // 6. set httpPost Entity
        httpPost.setEntity(se);

        // 7. Set some headers to inform server about the type of the content
        httpPost.setHeader("Accept", "application/json");
        //httpPost.setHeader("Content-type", "application/json");

        // 8. Execute POST request to the given URL
        HttpResponse httpResponse = httpclient.execute(httpPost);

        // 9. receive response as inputStream
        inputStream = httpResponse.getEntity().getContent();

        // 10. convert inputstream to string
        if(inputStream != null)
            result = convertInputStreamToString(inputStream);
        else
            result = "Did not work!";

        // 11. get HTTP post status
        StatusLine statusLine = httpResponse.getStatusLine();

        Log.v("result", result);

        /*if ( result.toString().equals("true") )
        {
            return result;
        } else if ( result.toString().equals("false") ){
            Toast.makeText(getBaseContext(), "No such user", Toast.LENGTH_LONG).show();
            Log.v("----------->", result);
            return null;
        }*/

      } catch (ClientProtocolException e) {
        Log.w("HTTP2:", e);
      } catch (IOException e) {
        Log.w("HTTP3:", e);
      } catch (Exception e) {
        Log.d("!!Exception!!", e.getLocalizedMessage());
      }

      return result;
   }

  @Override
  public void onClick(View view)
  {

    switch(view.getId()){
        case R.id.button_Post:
        {

            // If any idnumber or password NOT entered
            if( !validate() )
            {
                Toast.makeText(getBaseContext(), "Enter some data!", Toast.LENGTH_LONG).show();
            } else {
                // call AsynTask to perform network operation on separate thread
                String webApp_URL_overIP = "http://192.168.1.100:8080/WebApp/GetAndroidRequest";

                    Intent intent = new Intent(LoginActivity.this, HelpActivity.class);
                    startActivity(intent);
                    finish();
                  }
            break;
        }
      }
    }

   private class HttpAsyncTask extends AsyncTask<String, Void, String>
   {
      @Override
      protected String doInBackground(String... urls)
      {
          user = new User();
          user.setIdnumber(txt_id.getText().toString());
          user.setPassword(txt_password.getText().toString());

          return POST(urls[0],user);
      }

      @Override
      protected void onPostExecute(String result)
      {
        super.onPostExecute(result);

        if ( doInBackground(result).equals(false) || ( doInBackground(result).equals("false") ) )
        {
            Toast.makeText(getBaseContext(), "No such User! ", Toast.LENGTH_LONG).show();
            Log.d("-----------", "nO Such user mesajı");
        } else if ( ( doInBackground(result).equals(true) ) || ( doInBackground(result).equals("true") ) ) {
            Toast.makeText(getBaseContext(), "Success!!!!! ", Toast.LENGTH_LONG).show();
            Log.d(doInBackground(result), "Success!!!!!");
        }
    }

    @Override
    protected void onCancelled(String s) {
        super.onCancelled();
    }
  }

  private boolean validate()
  {
      if(txt_id.getText().toString().trim().equals(""))
      {
         return false;
      }else if(txt_password.getText().toString().trim().equals(""))
        {
           return false;
        }else
           {
              return !((txt_password.getText().toString().equals("")) && (txt_id.getText().toString().trim().equals("")));
           }

   private static String convertInputStreamToString(InputStream inputStream) throws IOException
   {
       BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
       String line;
       String result = "";
       while((line = bufferedReader.readLine()) != null)
           result += line;

       inputStream.close();
       return result;
   }
}

-------------------------------Hem Sunucu hem de İstemci tarafında aynı olan User model sınıfı-----------------------------


public class Users {

  private String idnumber;
  private String password;

  public Users() {
  }

  public Users(String idnumber, String password) {
      this.idnumber = idnumber;
      this.password = password;
  }

  public String getIdnumber() {
      return idnumber;
  }

  public void setIdnumber(String idnumber) {
      this.idnumber = idnumber;
  }

  public String getPassword() {
      return password;
  }

  public void setPassword(String password) {
      this.password = password;
  }

  @Override
  public String toString() {
      return "User [idnumber=" + idnumber + ", password=" + password + "]";    
  }
}

Eşleşme bulunan bir girş bilgisi post request edildiğinde oluşan çıktı mesajları:

--------------------------------------------------------
                        Server Side
--------------------------------------------------------

list: [User [idnumber=046789051865, password=641102331]]
list size: 1
user_idnumber: 046789051865
user_password: 641102331

*****************
Connecting to database...
*******************

{"server_result":true}
server_result: true
accepted

--------------------------------------------------------
                     Client Side
--------------------------------------------------------

I/ActivityManager﹕ Starting: Intent
V/result﹕ <!>app.LoginActivity 125<!> true
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters.
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters.
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters.
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters.

Herhangi bir eşleşme bulunmayan bir giriş bilgisi post request edildiğinde oluşan çıktı mesajları:

--------------------------------------------------------
                        Server Side
--------------------------------------------------------
list: [User [idnumber=00000, password=00000]]
list size: 1
user_idnumber: 00000
user_password: 00000

*****************
Connecting to database...
*******************

{"server_result":false}
server_result: false
rejected

--------------------------------------------------------
                     Client Side
--------------------------------------------------------

I/ActivityManager﹕ Starting: Intent
V/result﹕ <!>app.LoginActivity 125<!> false
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters.
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters.
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters.
D/!!Exception!!﹕ <i>app.LoginActivity 121<!> Target host must not be null, or set in parameters

Her iki şekilde de intent başlatılıyor. Esasında false olarak gönderilen cevap ile intent başlatılmaması gerekiyor. Sanıyorum onPostExecute() metodunda yanlışlık var, yada ben HttpAsyncTask sınıfını hiç anlamadım.

Sorunun uzun olmasından ötürü kusurum affola. Görüşlerinizi sabırsızlıkla bekliyorum. Saygılar.

soruldu: 12 Nis '14, 05:50

cagcak's gravatar image

cagcak
16271320
cevap kabul oranı: 25%

değiştirildi: 12 Nis '14, 05:52


Merhaba

AsyncTaskınız da recursive bir problem var gibi görünüyor.

http://www.ahmetcebisli.net/2011/12/android-asynctask-kullanimi/ linki inceleyebilirsiniz.

private class HttpAsyncTask extends AsyncTask<String, Void, String>
   {
      @Override
      protected String doInBackground(String... urls)
      {
          user = new User();
          user.setIdnumber(txt_id.getText().toString());
          user.setPassword(txt_password.getText().toString());

          return POST(urls[0],user);
      }

      @Override
      protected void onPostExecute(String result)
      {
        super.onPostExecute(result);

        if ( doInBackground(result).equals(false) || ( doInBackground(result).equals("false") ) )
        {
            Toast.makeText(getBaseContext(), "No such User! ", Toast.LENGTH_LONG).show();
            Log.d("-----------", "nO Such user mesajı");
        } else if ( ( doInBackground(result).equals(true) ) || ( doInBackground(result).equals("true") ) ) {
            Toast.makeText(getBaseContext(), "Success!!!!! ", Toast.LENGTH_LONG).show();
            Log.d(doInBackground(result), "Success!!!!!");
        }
    }

    @Override
    protected void onCancelled(String s) {
        super.onCancelled();
    }
  }

Yukarıda doInBackground çalıştıktan sonra,onPostExecute çalıştırır otomatik zaten. Siz onPostExecute içersinde tekrar doInBackground methodunu çağrmışsınız.

if ( doInBackground(result).equals(false) || ( doInBackground(result).equals("false") ) )
    {

Bunu yapmayın. doInBackground işini bitirdikten sonra,onPostExecute methodununa String result parametresi üzerinden işlemin sonucuna erişin. onPostExecute = ui thread yani.

özetle protected void onPostExecute(String result) methodunu gözden geçirebilirsiniz.

permanent link

cevaplandı: 12 Nis '14, 06:27

ismailkocacan's gravatar image

ismailkocacan
2.4k31733
cevap kabul oranı: 13%

Çook teşekkür ederim... saygılar..

(12 Nis '14, 07:25) cagcak cagcak's gravatar image

saygılar bizden :)

(12 Nis '14, 07:53) ismailkocacan ismailkocacan's gravatar image

onPostExecute(String result) metodundaki koşulları aşağıdaki gibi değiştirdiğimde sorun çözüldü:

@Override
    protected void onPostExecute(String result)
    {
        super.onPostExecute(result);

        if ( (result.equals(false)) || (result.equals("false")) )
        {
            Toast.makeText(getBaseContext(), "No such User! ", Toast.LENGTH_LONG).show();
            Log.d("-----------", "nO Such user mesajı");
        } else if ( (result.equals(true)) || (result.equals("true")) ) {
            Toast.makeText(getBaseContext(), "Success!!!!! ", Toast.LENGTH_LONG).show();
            Log.d(doInBackground(result), "Success!!!!!");
        }

    }
permanent link

cevaplandı: 12 Nis '14, 07:10

cagcak's gravatar image

cagcak
16271320
cevap kabul oranı: 25%

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×819
×39
×26
×6
×5

Soruldu: 12 Nis '14, 05:50

Görüntüleme: 1,387 kez

Son güncelleme: 12 Nis '14, 07:53

powered by BitNami OSQA