2011-08-28 66 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,這是另一種在後臺執行的動作的傳遞途徑。