2011-08-28 46 views
0

我对android非常新颖,我已经将一个简单的应用程序放在AsyncTask中测试多播数据包。帮助!应用程序等待,直到第二次运行时强制关闭

我第一次运行应用程序一切都如我所料,但如果关闭它并尝试第二次运行它,应用程序会挂起,直到强制关闭对话框启动。

之后我可以再次正常运行一次程序,依此类推。我认为我有些东西不能正确关闭。

我已经检查logcat的,但我得到的唯一信息是:

WARN/ActivityManager(1193): Activity idle timeout for HistoryRecord{45b352c0 android.projects.bserver/.BroadcastServer} 
WARN/ActivityManager(1193): Activity pause timeout for HistoryRecord{45b352c0 android.projects.bserver/.BroadcastServer} 

如果有人可以告诉我,我做错了什么这是造成在第二轮冻结,我将不胜感激。

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.InetAddress; 
import java.net.MulticastSocket; 
import android.app.Activity; 
import android.content.Context; 
import android.net.DhcpInfo; 
import android.net.wifi.WifiManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.widget.TextView; 
import android.widget.Toast; 

public class BroadcastServer extends Activity { 
public static final int PORT = 1200; 
TextView textStatus; 
String data = "this is a test"; 
public static boolean running = true; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    textStatus = (TextView)findViewById(R.id.writeBlock); 

    textStatus.append("\nStarting"); 

    MyAsync ma = new MyAsync(); 
    ma.execute(data); 
    textStatus.append("\nTaskRunning"); 
    ///////////////////////////////////////////// 
    try 
    { 
     InetAddress address = getBroadcastAddress();///////// 
     InetAddress multiGroup = InetAddress.getByName("224.0.5.255"); 

     ///////////////////////////////time to receive 

     MulticastSocket socket2 = new MulticastSocket(PORT);////// 
     socket2.joinGroup(multiGroup); 

     byte[] buf = new byte[1024]; 
     DatagramPacket packet2 = new DatagramPacket(buf, buf.length); 

     textStatus.append("\nWaiting to Receive"); 

     socket2.receive(packet2); 

     textStatus.append("\nReceived"); 

     String received = new String(packet2.getData()); 

     textStatus.append("\n" + received); 
     running = false; 

     textStatus.append("\nFinished"); 

    } 
    catch(IOException e) 
    { 
     textStatus.append("\nTaskFailed Outer: " + e.getMessage()); 
    } 
    textStatus.append("\nProgramDone"); 
} 

/////////////////////////////////////////////////// 

InetAddress getBroadcastAddress() throws IOException { 
    //Original Line: WifiManager wifi = mContext.getSystemService(Context.WIFI_SERVICE); 
    WifiManager wifi = (WifiManager)this.getSystemService(Context.WIFI_SERVICE); 

    DhcpInfo dhcp = wifi.getDhcpInfo(); 
    // handle null somehow  
    int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;  
    byte[] quads = new byte[4];  
    for (int k = 0; k < 4; k++)  
     quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);  
    return InetAddress.getByAddress(quads); 
} 

class MyAsync extends AsyncTask<String, Integer, String> 
{ 
    @Override 
    protected void onPreExecute() 
    { 
     textStatus.append("\nAsyncStarted"); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     ///////////////////////////////time to send 
     String data = params[0]; 

     try 
     { 
     InetAddress address = getBroadcastAddress();/////////////// 
     InetAddress multiGroup = InetAddress.getByName("224.0.5.255"); 

     MulticastSocket socket = new MulticastSocket(PORT); 
     socket.setBroadcast(true); 
     socket.joinGroup(multiGroup);////////// 
     DatagramPacket packet = new DatagramPacket(data.getBytes(), 
       data.length(), address, PORT); 

     //int count = 0; 
     while(BroadcastServer.running) 
     { 
      socket.send(packet); 
      //publishProgress(count); 
      //count++; 
     } 
     } 
     catch(IOException e) 
     { 
      textStatus.append("\nTaskFailed Inner: " + e.getMessage()); 
     } 

     return "AsyncDone"; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... count) 
    { 
     textStatus.append("\n" + count.toString()); 
    } 

    @Override 
    protected void onPostExecute(String results) 
    { 
     textStatus.append("\n"+results); 
    } 
} 
} 

回答

2

首先,你说的强制关闭,但我怀疑你看到的是不是一个强制关闭,但应用程序无响应(ANR),这是完全不同的。 ANR不是崩溃,这意味着你的应用程序在UI线程上花费了很多时间。

您正在UI线程上进行网络调用。你已经将一些东西移到了一个AsyncTask上,但是你需要从UI线程中获取与网络相关的所有东西。如果您注释掉网络代码,您的应用将会再次进行响应。

作为一般性提示,您可能还希望了解IntentService,这是另一种在后台执行的动作的传递途径。