1

我对android中的异步任务有疑问。我在下面的活动中有两个服务器调用。我需要知道在我的活动中应该将以下代码放在哪里:

new serverConnection().execute();

还有要放在里面的我的活动代码

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

我的活动的剩余代码将被放置在里面

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

我不知道在完成两个服务器调用的情况下使用异步任务的正确方法。如果只有一个服务器调用,那对我来说不是问题。但是当两个服务器调用同时出现时,我不知道正确的做法。我已经尝试了很多次,但仍然无法正确执行。有人可以帮我解决这个问题吗?

编辑:::在这种情况下我必须使用两个异步任务吗?

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

}

4

2 回答 2

1

您应该将所有连接/网络代码放在 doInBackground() 中,然后如果您需要更新 ui,您应该在 onPostExecute() 中进行

于 2014-03-17T22:39:59.250 回答
1
  1. 无论你做什么网络相关的事情,都应该在 AsyncTask 的 'doInBackground()' 函数中完成

  2. 如果你有两个对服务器的调用并且都是独立的,那么你可以一次启动 2 个 AsyncTasks。

  3. 如果它们是依赖的,您可以将这两个调用组合在一个 AsyncTask 中。IE。第二次服务器调用在第一次完成后开始。

编辑:

  1. 使用 2 个异步任务。调用第一个任务,进行身份验证。
  2. 在第一个 AsyncTask 的 onPostExecute 中,检查用户是否从任务的结果中注册。
  3. 根据结果​​,如果要启动下一个服务器连接,从第 1 个的 onPostExecute 启动第 2 个 AsyncTask。如果有一些错误/失败,从第一个任务的 onPostExecute 中抛出一些用户反馈
于 2014-03-17T22:45:13.620 回答