0

Android 4.0 では、UI スレッドでのネットワークが許可されていません。というわけで新スレ立てました。

public class NetThread extends Thread {
    BukkitController bc;
    Socket sock;
    ObjectOutputStream outstream;
    ObjectInputStream instream;
    boolean loaded=false;
    String ServerIP="192.168.123.103";
    String id="ssw";
    String pw="ssw";
    ArrayList<String> plist=new ArrayList<String>();
public void run(){
    try {
        sock=new Socket(ServerIP,3560);
        outstream=new ObjectOutputStream(sock.getOutputStream());
        instream=new ObjectInputStream(sock.getInputStream());
        //LOGIN
        outstream.writeObject("SIGN "+id+" "+pw);
    } catch (Exception e){}
        Object tmp;
        try{
        outstream.writeObject("PLIST");
        plist=(ArrayList<String>) instream.readObject();
        } catch ( Exception e){
        }


    loaded=true;
    while(true){}
}
public void Write(String msg){
    try {
        outstream.writeObject(msg);
    } catch ( Exception e){
    }
}

}

そして、UI スレッドで、オブジェクトを作成しました:

m_nt=new NetThread();
m_nt.start();

LogCat でテストした後、ソースが次の場所で停止することがわかりました。

sock=new Socket(ServerIP,3560);

どうすればこれを解決できますか? エラーはありませんでした。そこでフリーズしました。

4

3 に答える 3

0

ネットワークコードの処理にはAsynctaskを使用することをお勧めします。私はそれを認めなければなりませんが、あなたのコードがただ止まるのは奇妙です。サーバーが利用できない場合は、例外が発生するはずです。

AsyncTasksの追加情報については、Android開発者を確認してください

于 2012-05-10T08:56:33.893 に答える
0

Honeycombe の UI スレッドでネットワーク IO を実行することはできません。技術的には、以前のバージョンの Android では可能ですが、アプリが応答しなくなり、OS が不適切な動作のためにアプリを強制終了する可能性があるため、非常に悪い考えです。バックグラウンド プロセスを実行するか、AsyncTask を使用してバックグラウンド スレッドでネットワーク トランザクションを実行する必要があります。

Android 開発者サイトには、Painless Threadingのリンクに関する記事があります。これは、これについての優れた紹介であり、ここで現実的に提供できるよりもはるかに深い回答を提供します。

于 2012-05-10T08:51:13.150 に答える
0

これを使って:

try{
sock=new Socket(InetAddress.getByName(ServerIP),3560);
//more here
}
catch {Exception e}
{
Log.e("MyThread", "Error " + e.getMessage());
e.printStackTrace();
}
于 2012-05-10T08:54:13.130 に答える