如何使用多个AsyncTasks

时间:2014-05-27 16:08:59

标签: android sockets android-asynctask

我正在编写使用套接字的Android应用程序的客户端。由于我是AsyncTask的新手,我编写了一些简单的东西来测试我的理解。这是我所拥有的,似乎是正确的:

public class Messaggi extends ActionBarActivity implements OnClickListener {

LinearLayout mLayout;
ScrollView scroll;
EditText writeMessage;
Button send; 
Socket connection;  

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_messaggi);
    mLayout = (LinearLayout) findViewById(R.id.linearVertical);
    scroll = (ScrollView) findViewById(R.id.scrollView1);
    writeMessage= (EditText)findViewById(R.id.ScriviMessaggio);
    send= (Button)findViewById(R.id.invia);
    send.setOnClickListener(this);
    LavoraDietro asd = new LavoraDietro();
    asd.execute();   
}
@Override
public void onClick(View v) {
}

private void updateScroll(){ 
    scroll.post(new Runnable() {
           @Override
           public void run() { 
             scroll.fullScroll(View.FOCUS_DOWN);
           }
        });
}

private TextView createNewTextView(String text) {
    final LayoutParams lparams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    final TextView textView = new TextView(this);
    textView.setLayoutParams(lparams);
    textView.setText("Client: " + text);
    return textView;
}

private class LavoraDietro extends AsyncTask<Void, Void, Boolean> {
    String mex;
    @Override  
    protected Boolean doInBackground(Void... params){ 
        try {
            InetAddress local = InetAddress.getByName("192.168.1.79");
            Socket connection= new Socket(local , 7100);
              DataOutputStream output = new DataOutputStream(connection.getOutputStream());
                output.writeUTF("Client: Server prova");
                output.flush();
            DataInputStream input = new DataInputStream(connection.getInputStream());
            mex= input.readUTF();
        } catch (UnknownHostException e) {
             // TODO Auto-generated catch block 
            e.printStackTrace();
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace(); 
            return false;
        }catch(Exception e){
            e.printStackTrace();
            } 
        return true;
    } 

    @Override 
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        if(result == true){
            mLayout.addView(createNewTextView("Sono connesso al server"));  
        mLayout.addView(createNewTextView("I canali sono aperi.."));
        mLayout.addView(createNewTextView(mex));
        updateScroll();
        }
        else{
        mLayout.addView(createNewTextView("ERRORE CONNESSIONE AL SERVER "));
        updateScroll();
        }
        }
} 
}

当建立与服务器的连接时,客户端会发送测试用法,服务器应该将相同的消息发送到客户端,然后打印出来。

但我的任务是在应用程序打开时立即建立连接,并仅在按下“发送”按钮时发送消息。是否可以创建多个AsyncTasks并使它们同时工作而不会使应用程序崩溃?如果是,请您发一个如何做到这一点的例子?

已编辑的代码

这是我的新代码:

public class Messaggi extends ActionBarActivity implements OnClickListener {

LinearLayout mLayout;
ScrollView scroll;
EditText writeMessage;
Button send; 
Socket connection;  

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_messaggi);
    mLayout = (LinearLayout) findViewById(R.id.linearVertical);
    scroll = (ScrollView) findViewById(R.id.scrollView1);
    writeMessage= (EditText)findViewById(R.id.ScriviMessaggio);
    send= (Button)findViewById(R.id.invia);
    send.setOnClickListener(this);
    LavoraDietro asd = new LavoraDietro();
    asd.execute();   
}
@Override
public void onClick(View v) {
 CliccaInvia asd123 = new CliccaInvia();
    asd123.execute(connection);
}

private void updateScroll(){ 
    scroll.post(new Runnable() {
           @Override
           public void run() { 
             scroll.fullScroll(View.FOCUS_DOWN);
           }
        });
}

private TextView createNewTextView(String text) {
    final LayoutParams lparams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    final TextView textView = new TextView(this);
    textView.setLayoutParams(lparams);
    textView.setText("Client: " + text);
    return textView;
}

private class LavoraDietro extends AsyncTask<Void, Void, Socket> {
    String mex;
    @Override  
    protected Socket doInBackground(Void... params){ 
        try {
            InetAddress local = InetAddress.getByName("192.168.1.79");
            connection= new Socket(local , 7100);
            DataInputStream input = new DataInputStream(connection.getInputStream());
            mex = input.readUTF();
        } catch (UnknownHostException e) {
             // TODO Auto-generated catch block 
            e.printStackTrace();
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace(); 
        }catch(Exception e){
            e.printStackTrace();
            } 
        return connection;
    } 

    @Override 
    protected void onPostExecute(Socket result) {
        super.onPostExecute(result);
        if(result != null){
            mLayout.addView(createNewTextView("Sono connesso al server"));  
        mLayout.addView(createNewTextView("I canali sono aperi.."));
        mLayout.addView(createNewTextView(mex));
        updateScroll();
        }
        else{
        mLayout.addView(createNewTextView("ERRORE CONNESSIONE AL SERVER "));
        updateScroll();
        }
        }
} 

private class CliccaInvia extends AsyncTask<Socket, Void, Boolean>{

@Override
protected Boolean doInBackground(Socket... params) {

        try {
            DataOutputStream output = new DataOutputStream(connection.getOutputStream());
            output.writeUTF("Client: Server prova");
            output.flush();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
return false
        }
        return true;
}

@Override 
protected void onPostExecute(Boolean result) {
    super.onPostExecute(result);
    if(result == true){
        mLayout.addView(createNewTextView("Message Sent")); 

    aggiornaScroll();
    }
    else{
    mLayout.addView(createNewTextView("Error sending Mex "));
    aggiornaScroll();
    }
}

}

但这不起作用.. :(

1 个答案:

答案 0 :(得分:0)

好吧,如果你需要产生很多任务并跟踪它们,你可以做这样的事情

List<LavoraDietro> tasks = new ArrayList<LavoraDietro>();

LavoraDietro task = new LavoraDietro();
task.execute;
tasks.add(task);

然后在onPostExecute

的LavoraDietro中
tasks.remove(this);

但如果你愿意,你可以通过百万种方式建立联系。我推荐Apache的库。 http://hc.apache.org/httpclient-3.x/

以下是如何建立连接的示例,只需从任务的后台调用此函数即可。

public static InputStream getHTTPRequest(String url, ArrayList<NameValuePair> parameters, ArrayList<NameValuePair> headers)
    {
        final String TAG = "getHTTPRequest";

        HttpGet getRequest = new HttpGet(url);

        // attach all and any params
        if (parameters != null && parameters.size() > 0)
        {
            HttpParams params = getRequest.getParams();
            for (NameValuePair param : parameters)
            {
                params.setParameter(param.getName(), param.getValue());
            }
            getRequest.setParams(params);
        }

        // attach all and any headers
        if (headers != null && headers.size() > 0)
        {
            for (NameValuePair header : headers)
            {
                getRequest.addHeader(header.getName(), header.getValue());
            }
        }

        getRequest.addHeader("Content-type", "application/json");
        getRequest.addHeader("Accept", "application/json");
        DefaultHttpClient client = new DefaultHttpClient();
        try
        {

            HttpResponse getResponse = client.execute(getRequest);
            final int statusCode = getResponse.getStatusLine().getStatusCode();

            if (statusCode != HttpStatus.SC_OK)
            {
                Log.d(TAG, "status not ok");
                Log.d(TAG, "status = " + Integer.toString(statusCode));
                Log.d(TAG, "url = " + getRequest.getURI().toString());
                return null;
            }

            HttpEntity getResponseEntity = getResponse.getEntity();
            Log.d(TAG, "returning valid content");
            return getResponseEntity.getContent();

        } catch (IOException e)
        {
            Log.d(TAG, "IOException: getRequest.abort");
            getRequest.abort();
        }

        return null;
    }