当我尝试向服务器发送请求时,我的应用崩溃

时间:2017-02-11 23:31:48

标签: android-studio android-intentservice

嗯,它实际上在我的android工作室模拟器上工作得很好但是当我尝试在我的手机上运行时它只是崩溃了。 我只想向服务器发送一个号码,并获得一个响应,其中包含我需要的数据。所以这是我的代码:

        thread = new Thread() {
            @Override
            public void run() {
                //server stuff
                try {
                    //Connecting
                    if(!userClass.equals("")) {
                        Log.i(debugString, "Attempting to connect to server");
                        socket = new Socket(hostname, portnumber);
                        Log.i(debugString, "Connection established!");
                        BufferedWriter bw = new BufferedWriter((new OutputStreamWriter(socket.getOutputStream())));
                        bw.write("" + userClass);
                        bw.newLine();
                        bw.flush();

                        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        input = br.readLine();
                    }

                } catch (IOException e) {
                    Log.e(debugString, e.getMessage());
                } finally {
                    threadComplete = true;
                }
            }
        };
        thread.start();

    while(!threadComplete)
        continue;

然后我只想使用这个线程,只要我想获得我的请求的更新信息:

        String getUserClass = userClass;
    if(!getUserClass.equals(""))
    {
        threadComplete = false;
        userClass = getUserClass;
        thread.start();

        while (!threadComplete)
            continue;

        changes.setText(input);
    }
    else Toast.makeText(this, "Error, choose your class", Toast.LENGTH_SHORT).show();
顺便说一下,在每个线程的末尾(在模拟器上,因为在我的手机上崩溃)我收到一条消息: Skipped 91 frames! The application may be doing too much work on its main thread.

我还有另一个问题,我也使用IntentService在后​​台运行我的应用服务,显然我不希望它永远运行,所以我做了一个包含在每个循环结束wait()命令,但问题是当我设置等待时间超过3000毫秒左右时,服务崩溃。 我的后台服务代码:

        synchronized (this) {
        int count = 0;
        while (count<4) {

            try {
                wait(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            if (notifications && !userClass.equals("")) {

                new Thread() {
                    @Override
                    public void run() {
                        //server stuff
                        try {
                            //Connecting
                            if (!userClass.equals("")) {
                                Log.i("debug", "Attempting to connect to server");
                                socket = new Socket(hostname, portnumber);
                                Log.i("debug", "Connection established!");
                                BufferedWriter bw = new BufferedWriter((new OutputStreamWriter(socket.getOutputStream())));
                                bw.write("" + userClass);
                                bw.newLine();
                                bw.flush();

                                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                                input = br.readLine();
                            }

                        } catch (IOException e) {
                            Log.e("debug", e.getMessage());
                        } finally {
                            complete = true;
                        }
                    }
                }.start();

                while (!complete)
                    continue;

                Toast.makeText(this, "" + input, Toast.LENGTH_SHORT).show();


                NotificationManager mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                NotificationCompat.Builder mBuilder =
                        new NotificationCompat.Builder(this)
                                .setSmallIcon(R.drawable.chanka)
                                .setContentTitle("ביטול שיעורים: ")
                                .setContentText(input);

                mNotifyMgr.notify(mNotificationId, mBuilder.build());
                mNotificationId++;

                Toast.makeText(this, "" + input, Toast.LENGTH_SHORT).show();
                count++;
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

以下这段代码是罪魁祸首 -

while (!threadComplete)
   continue;

你有点把主线程放在长循环上。 Android不允许这样做。这类用例中的一般结构是 -

  

步骤1 - 向用户显示指示您的进度对话框   做一些重要的事情,用户需要等到这一点   完成。在进度对话框中显示一些有意义的文本   对用户有意义。

     

步骤2 - 启动与服务器的异步连接。有很多   Android中的选项可以做到这一点。但出于您的目的AsyncTask可能   很有用。连接到您的服务器,获取并解析数据   doInBackground的{​​{1}}方法,一旦任务完成,   让AsyncTask将相同内容发布到主线程。

     

步骤3 - 从异步任务中获取结果后,您可以   取消进度对话框并继续你正在做的任何事情。

请注意,主线程不应随时被阻止。这是应用程序的事件处理线程,处理所有事件(用户启动或系统启动)。如果线程被阻止,则会出现您现在看到的那种错误。特别是在你的情况下,由于while循环,Android系统无法进行一些绘制操作。

答案 1 :(得分:0)

创建一个新的Asynctask并在其中运行套接字建立代码:)

     socket = new Socket(hostname, portnumber);