有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓 java。lang.IllegalThreadStateException:线程已启动,但只有1个线程

当我想启动一个线程时,它只是在Android棉花糖和更低版本上崩溃。我有一个自动启动脚本,它调用我的支票。启动时的java脚本已完成。在安卓N上它可以工作,但在安卓棉花糖和更低版本上它不能工作。。。它告诉我一个线程已经启动,而该线程是唯一一个被称为。。。我尝试过增加睡眠(100);并检查线程是否处于活动状态,但没有任何工作。。。我怎样才能修好它

--------- beginning of crash
E/AndroidRuntime( 2436): FATAL EXCEPTION: main
E/AndroidRuntime( 2436): Process: com.company.app, PID: 2436
E/AndroidRuntime( 2436): java.lang.IllegalThreadStateException: Thread already started
E/AndroidRuntime( 2436):        at java.lang.Thread.checkNotStarted(Thread.java:849)
E/AndroidRuntime( 2436):        at java.lang.Thread.start(Thread.java:1059)
E/AndroidRuntime( 2436):        at com.company.app.CheckRoosterWijziging$SayHello$1.run(CheckRoosterWijziging.java:94)
E/AndroidRuntime( 2436):        at 安卓.os.Handler.handleCallback(Handler.java:739)
E/AndroidRuntime( 2436):        at 安卓.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime( 2436):        at 安卓.os.Looper.loop(Looper.java:135)
E/AndroidRuntime( 2436):        at 安卓.app.ActivityThread.main(ActivityThread.java:5254)
E/AndroidRuntime( 2436):        at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 2436):        at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime( 2436):        at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
E/AndroidRuntime( 2436):        at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:698)

我的帖子:

Thread wijzigingenThread = new Thread() {
    @Override
    public void run() {
        try {
            sleep(100);
            try {
                System.out.println("Hello test");
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

自动启动。爪哇

package com.company.app;

import 安卓.content.BroadcastReceiver;
import 安卓.content.Context;
import 安卓.content.Intent;
import 安卓.content.SharedPreferences;
import 安卓.preference.PreferenceManager;

public class autostart extends BroadcastReceiver {
    public void onReceive(Context arg0, Intent arg1) {
         Intent intent = new Intent(arg0, CheckRoosterWijziging.class);
         arg0.startService(intent);
    }
}

CheckRoosterWijziging。爪哇

package com.company.app;

import 安卓.app.Notification;
import 安卓.app.NotificationManager;
import 安卓.app.Service;
import 安卓.content.Context;
import 安卓.content.Intent;
import 安卓.content.SharedPreferences;
import 安卓.graphics.Typeface;
import 安卓.os.Binder;
import 安卓.os.Bundle;
import 安卓.os.Handler;
import 安卓.os.IBinder;
import 安卓.os.Looper;
import 安卓.support.v4.app.NotificationCompat;
import 安卓.text.SpannableStringBuilder;
import 安卓.text.style.ForegroundColorSpan;
import 安卓.text.style.StrikethroughSpan;
import 安卓.text.style.StyleSpan;
import 安卓.util.Log;
import 安卓.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import java.util.Timer;
import java.util.TimerTask;
import java.util.TreeMap;
import java.util.regex.Pattern;

public class CheckRoosterWijziging extends Service {
    private NotificationManager mNM;
    private int NOTIFICATION = 10;
    Handler handler;
    MainActivity main = MainActivity.getMain();
    final int NOTIFICATION_ID = 10;
    NotificationManager notificationManager;
    static CheckRoosterWijziging checkRoosterWijziging;

    public class LocalBinder extends Binder {CheckRoosterWijziging getService() {return CheckRoosterWijziging.this;}}

    @Override
    public void onCreate() {
        handler = new Handler(Looper.getMainLooper());
        checkRoosterWijziging = this;
        mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        System.out.println("Service");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("CheckRoosterWijziging", "Received start id " + startId + ": " + intent);
        showNotification();
        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        mNM.cancel(NOTIFICATION);
        Toast.makeText(this, "Stopped", Toast.LENGTH_SHORT).show();
    }

    @Override
    public IBinder onBind(Intent intent) {return mBinder;}

    private final IBinder mBinder = new LocalBinder();

    class SayHello extends TimerTask {
       public void run() {
           handler.post(new Runnable() {
               public void run() {
                   wijzigingenThread.start();
               }
           });
       }
   }


    private void showNotification() {
        Timer timer = new Timer();
        timer.schedule(new SayHello(), 15000, 15000);
    }

共 (2) 个答案

  1. # 1 楼答案

    计时器在同一个Thread对象上多次调用start(),这导致了IllegalThreadStateException。在调用start之前,可以使用一个标志指示线程是否已经启动,或者检查Thread.getState()。例如:

    if (wijzigingenThread.getState().equals(Thread.State.NEW)) {
        wijzigingenThread.start();
    }
    
  2. # 2 楼答案

    通过将新线程()移动到原始Wijziging线程所在的位置来修复。调用了start()

    所以我做了以下几件事:

    原件:

    class SayHello extends TimerTask {
           public void run() {
               handler.post(new Runnable() {
                   public void run() {
                       wijzigingenThread.start();
                   }
               });
           }
       }
    

    新的:

    class SayHello extends TimerTask {
           public void run() {
               handler.post(new Runnable() {
                   public void run() {
                       new Thread() {
                            @Override
                            public void run() {
                                try {
                                    sleep(100);
                                    try {
                                        System.out.println("Hello test");
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                        }.start();
                   }
               });
           }
       }
    

    感谢@JoeC帮助我,为我指明了正确的方向