2014-03-17 3 views
1

У меня есть сомнения относительно задачи async в android. У меня есть два вызова сервера в моей деятельности ниже. Мне нужно знать, где я должен поместить следующий код в моей деятельности:с использованием async-задачи в соединениях клиентского сервера в android

new serverConnection().execute(); 

Также коды моей деятельности, которые должны быть размещены внутри

@Override 
protected Void doInBackground(Void... params) { 
} 

И оставшийся код моей деятельности, которые для размещения внутри

@Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
    } 

Я не знал, как правильно использовать асинхронную задачу, где должны выполняться два вызова сервера. Если есть только один вызов сервера, это не будет проблемой для меня. Но когда два вызова сервера поступают одновременно, я не знал, как это сделать. и я много раз пробовал, но все еще не смог сделать правильно. Может кто-нибудь помочь мне в этом вопросе ??

EDIT ::: Должен ли я использовать две асинхронные задачи в этом случае?

package com.example.onlineauction; 

import java.util.Calendar; 

import com.example.onlineauction.MainPage.serverConnection; 



import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.app.ActionBar; 
import android.app.Activity; 
import android.app.AlarmManager; 
import android.app.AlertDialog; 
import android.app.PendingIntent; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.graphics.Color; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class MainActivity extends Activity { 
ProgressDialog dialog=null; 
String keyfail; 
Calendar cal=Calendar.getInstance(); 


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

    final EditText username1=(EditText)findViewById(R.id.username); 
    final EditText password1=(EditText)findViewById(R.id.password); 




    Button login=(Button)findViewById(R.id.login); 
    Button register=(Button)findViewById(R.id.register); 


    login.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      new serverConnection().execute(); 
      CallSoap cs=new CallSoap(); 

      try{ 


       String username=username1.getText().toString(); 
       String password=password1.getText().toString(); 
       keyfail="Failed login"; 
//Calling the server first time and getting response from server 
       String response=cs.calllogin(username,password); 
       if(response.equalsIgnoreCase("Failed login")) 
       { 
        AlertDialog.Builder ab=new AlertDialog.Builder(MainActivity.this); 
        ab.setTitle("Clear the errors"); 
        ab.setMessage("Either Username or Password is Incorrect"); 
        ab.setCancelable(false); 
        ab.setPositiveButton("OK I will clear it",new DialogInterface.OnClickListener() { 

         public void onClick(DialogInterface dialog, int which) { 
          // TODO Auto-generated method stub 

         } 


        }); 
        AlertDialog alertdialog=ab.create(); 
        alertdialog.show();      
       } 
       else 
       { 
//THis is the second call to the server and getting name from server 
       String name=cs.retreivename(username, password); 
       //String[] columns = name.split(" "); 
       //Log.d("Count: ",count); 
       //assert columns.length == 2; 
       //String message1=columns[0]; 
       //String message2=columns[1]; 
       String keysuccess,keyfail = null,keyname; 

       keysuccess="Success";// 
       //keyname=message2; 
       Log.d("Message: ",response); 
       Log.d("Name of user: ",name); 
       if(response.equals(keysuccess)) 
       { 
        Toast.makeText(MainActivity.this,"Login Success",Toast.LENGTH_LONG).show(); 
        Intent i1=new Intent(MainActivity.this,Category.class); 


        SharedPreferences sp1=getSharedPreferences("My_login", MODE_PRIVATE); 
        Editor editor=sp1.edit(); 
        editor.putString("name", name); 
        editor.putString("username",username); 
        editor.putString("password",password); 
        editor.commit(); 
        startActivity(i1); 



       } 

      } 
      } 
      catch(Exception ex) 
      { 
       Log.d("Exception in main activity", "Activity main"); 
      } 


     } 
    }); 
    register.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      Intent in=new Intent(MainActivity.this, NewRegistration.class); 
      startActivity(in); 
     } 
    }); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // TODO Auto-generated method stub 
    switch (item.getItemId()) { 
    case R.id.i1: 
    { 

     Intent intent = new Intent(Intent.ACTION_MAIN); 
     intent.addCategory(Intent.CATEGORY_HOME); 
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(intent); 
     //finishFromChild(Activity Registration.class); 
     System.exit(0); 

     finish(); 
    } 


     break; 

    default: 
     break; 
    } 
    return super.onOptionsItemSelected(item); 
} 

//This is the code for async task. 
public class serverConnection extends AsyncTask<Void, String, Void> { 

    @Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.set, menu); 
    return true; 
} 

}

ответ

1
  1. Безотносительно связанный с сетью, должен выполняться внутри функции doInBackground() для AsyncTask

  2. Если у вас есть два вызова на сервер, и оба они независимы, t Вы можете запустить 2 AsyncTasks сразу.

  3. Если они зависят от вас, вы можете объединить два вызова внутри одной AsyncTask. то есть. 2-й вызов сервера начинается после завершения 1-го.

Edit:

  1. Используйте 2 AsyncTasks. Вызовите 1-ю задачу, сделайте свой материал аутентификации.
  2. Внутри onPostExecute 1-й AsyncTask проверьте, зарегистрирован ли пользователь из результатов задачи.
  3. В зависимости от результатов, если вы хотите начать следующее подключение к серверу, запустите вторую AsyncTask из onPostExecute 1-го. Если есть некоторая ошибка/сбой, бросьте некоторую обратную связь с пользователем onPostExecute из 1-й задачи
+0

В моем случае я сначала назвал сервер для проверки пользователя с именем пользователя и паролем. И я второй раз позвонил серверу, чтобы получить его имя из базы данных сервера, используя имя пользователя и пароль. В промежутке между первым и вторым вызовами сервера проверяется, является ли логин действительным или нет. Если он действителен, то инициируется только второй вызов сервера. Если он недействителен, второй вызов не инициируется. Так что я должен использовать две асинхронные задачи.? – njnjnj

+0

проверить изменения – geekoraul

+0

спасибо ... вы спасли весь мой день ... – njnjnj

1

Вы должны поместить весь код подключения/сети в doInBackground(), а затем, если вам необходимо обновить пользовательский интерфейс, вы должны сделать это в onPostExecute()

+0

Не могли бы вы отредактировать мой код и объяснить его мне. Потому что я не понял его полностью. Пожалуйста, – njnjnj

+0

. Должен ли я использовать две задачи async здесь, потому что я использую два вызова сервера в разных местах. – njnjnj

+1

Да, вы должны использовать 2 асинхронные задачи. Если первое успешно, то onPostExecute вы должны запустить второй. – gtsouk