Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Logcat显示“;“关闭虚拟机”;_Android_Sockets_Android Logcat - Fatal编程技术网

Android Logcat显示“;“关闭虚拟机”;

Android Logcat显示“;“关闭虚拟机”;,android,sockets,android-logcat,Android,Sockets,Android Logcat,我正在尝试连接到服务器并打印响应。 奇怪的是,当我点击活动中启动连接的按钮时, 它会立即强制关闭。 查看logcat后,我看到的是VM正在关闭。 我确实看到,似乎有人看到了与我类似的问题: 不幸的是,我认为这个问题并没有得到真正的回答,这让我很困惑 堆栈跟踪: 03-06 20:12:47.012: I/System.out(2757): I'm in main 03-06 20:12:48.092: D/gralloc_goldfish(2757): Emulator without GPU

我正在尝试连接到服务器并打印响应。
奇怪的是,当我点击活动中启动连接的按钮时,
它会立即强制关闭。
查看
logcat
后,我看到的是VM正在关闭。
我确实看到,似乎有人看到了与我类似的问题:

不幸的是,我认为这个问题并没有得到真正的回答,这让我很困惑

堆栈跟踪:

03-06 20:12:47.012: I/System.out(2757): I'm in main
03-06 20:12:48.092: D/gralloc_goldfish(2757): Emulator without GPU emulation detected.
03-06 20:13:03.462: I/System.out(2757): I'm at quote viewer
03-06 20:13:04.291: I/Choreographer(2757): Skipped 32 frames!  The application may be doing too much work on its main thread.
03-06 20:13:09.881: D/AndroidRuntime(2757): Shutting down VM
03-06 20:13:09.881: W/dalvikvm(2757): threadid=1: thread exiting with uncaught exception (group=0x40a70930)
03-06 20:13:09.901: D/dalvikvm(2757): GC_CONCURRENT freed 130K, 9% free 2652K/2888K, paused 80ms+5ms, total 222ms
03-06 20:13:09.941: E/AndroidRuntime(2757): FATAL EXCEPTION: main
03-06 20:13:09.941: E/AndroidRuntime(2757): java.lang.IllegalStateException: Could not execute method of the activity
第3行(“我在quote viewer”)是我在QuoteView实践中的一部分,在这里我有一个按钮,按下时可以连接到服务器。
下面是QuoteViewPractivity的代码:

package com.pheno.networkprogrammingiphenoexercise;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class QuoteViewerActivity extends Activity {
    private String mHost = "ota.iambic.com";
    private int mPort = 17;
    private TextView mQuote1, mQuote2, mQuote3;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        System.out.println("I'm at quote viewer");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quote_viewer);
        mQuote1 = (TextView)findViewById(R.id.quote1);
        mQuote2 = (TextView)findViewById(R.id.quote2);
        mQuote3 = (TextView)findViewById(R.id.quote3);
    }

    public void showQuotes(View clickedButton) {

        try {
            TextView[] quoteArray = {mQuote1, mQuote2, mQuote3};
            for(int i = 0; i < 3; i++) {
                Socket socket = new Socket(mHost, mPort);
                System.out.println("Get Socket");
                BufferedReader in = SocketUtils.getReader(socket);
                String quoteResult = in.readLine();
                System.out.println(quoteResult);
                quoteArray[i].setText(quoteResult);
                socket.close();
            }
        } catch(UnknownHostException uhe) {
            mQuote1.setText("Unknown host: " + mHost);
            //uhe.printStackTrace();
            Log.e("pheno", "What happened", uhe);
        } catch(IOException ioe) {
            mQuote1.setText("IOException: " + ioe);
            Log.e("pheno", "What happened", ioe);
        }
    }
}
package com.pheno.networkprogrammingiphoneexercise;
导入android.app.Activity;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.TextView;
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.net.Socket;
导入java.net.UnknownHostException;
公共类QuoteViewPractivity扩展活动{
私有字符串mHost=“ota.iambic.com”;
私有整数mPort=17;
私有文本视图mQuote1、mQuote2、mQuote3;
@凌驾
创建时的公共void(Bundle savedInstanceState){
System.out.println(“我在报价查看器”);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quote_viewer);
mQuote1=(TextView)findViewById(R.id.quote1);
mQuote2=(TextView)findViewById(R.id.quote2);
mQuote3=(TextView)findViewById(R.id.quote3);
}
公共作废显示报价(查看单击按钮){
试一试{
TextView[]quotarray={mQuote1,mQuote2,mQuote3};
对于(int i=0;i<3;i++){
插座插座=新插座(mHost、mPort);
System.out.println(“获取套接字”);
BufferedReader in=SocketUtils.getReader(套接字);
字符串quoteResult=in.readLine();
系统输出打印项次(quoteResult);
引用array[i].setText(引用结果);
socket.close();
}
}捕获(未知后异常uhe){
mQuote1.setText(“未知主机:+mHost”);
//uhe.printStackTrace();
Log.e(“现象”,“发生了什么”,uhe);
}捕获(ioe异常ioe){
mQuote1.setText(“IOException:+ioe”);
Log.e(“物候”,“发生了什么”,ioe);
}
}
}

任何帮助或建议都将不胜感激!谢谢

我不能确定为什么模拟器会显示出这个确切的错误,但我知道一个事实,即在4.0之前的设备(和模拟器)中,您所做的是非常不受欢迎的,并且在4.0+设备中通常是禁止的。也就是说,您应该始终在单独的线程上执行任何网络调用。正确的方法是使用

这些对象非常丑陋,但也是确保不占用UI线程的最佳方法。UI线程是当前运行
showQuotes
方法的线程,Android希望该线程只做简单的事情。如果开始排队等待太多事件,Android 4.0+将使应用程序崩溃。我认为在4.0之前,它看起来会被冻结(我想基本上就是你想要它做的),但我不会指望它

因此,对于AsyncTask,您可以这样编写:

AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>()
{
String someData = "";

@Override
protected Void doInBackground(Void... unused)
{
    // Here, do your networking stuff, but don't access
    // UI elements (such as whatever.setText).

    someData = getStuffFromSocketsBlahBlah();

    // This method is called from a different (non-UI thread) automatically
    // shortly after you call task.execute()
}

@Override
protected void onPostExecute(Void unused)
{
    // This will get called from the main (UI thread)  shortly after doInBackground returns.
    // Here it is okay to access UI elements but not to do any serious work
    // or blocking network calls (such as socket.read, etc.)

    someTextView.setText(someData);
}

};

task.execute(null, null, null);
AsyncTask task=new AsyncTask()
{
字符串someData=“”;
@凌驾
受保护的空位背景(空位…未使用)
{
//在这里,做你的网络工作,但不要访问
//UI元素(例如whatever.setText)。
someData=getStuffFromSocketsBlahBlah();
//此方法是从不同的(非UI线程)自动调用的
//调用task.execute()后不久
}
@凌驾
受保护的void onPostExecute(未使用的void)
{
//在doInBackground返回后不久,将从主(UI线程)调用此函数。
//在这里,可以访问UI元素,但不做任何严肃的工作
//或阻止网络调用(如socket.read等)
setText(someData);
}
};
task.execute(null,null,null);

你不得不做这样的事情很糟糕,因为与编写桌面应用程序相比,这是违反直觉的,但问题是Android必须同时运行多个应用程序,并且当另一个应用程序出现在前台时,能够随时快速挂起你的应用程序(这允许Android在不消耗电池的情况下“多任务”),这就是为什么您的UI线程总是或多或少地可用于传入事件。

添加更多日志记录。您想知道导致问题的确切行数。这就是应用程序崩溃时发生的情况。查看应用程序崩溃后的行数,看看是什么代码行导致错误。感谢您的建议,我正在添加更多日志,而且看起来确实如此已经查明了由于额外日志导致的问题(这似乎是Alex下面所说的!)另外,请看您将操作侦听器添加到按钮的代码以及调用showQuotes方法的代码?这将有助于诊断问题。谢谢,Alex!我非常感谢,因为我几乎要绞尽脑汁去寻找出了什么问题(特别是教程的示例几乎完成了我正在做的事情,但我的代码是强制关闭,而它的代码不是)。正如您所说,教程的代码在连接时感觉冻结(它是在4.0之前构建的),因为我的代码在4.1中,所以不允许在教程中实现。是时候让我学习Android上的AsyncTask了!这肯定与我的桌面时代不同~:)再次感谢。是的,没问题。我在4.1刚刚发布的时候在我的应用程序中遇到了这个问题。我想Android 4.0及以后会专门检查你是否在主线程上进行网络调用并引发异常。但这仍然很奇怪,因为你没有收到异常。你的logcat错误似乎说它只是简单的“waiti”我也是