2012-08-27 89 views
2

我的线程无法正常工作。它每3秒执行RepeatingThread()方法中的所有代码,但不执行run()方法中的所有代码。我究竟做错了什么?线程无法正常工作 - Android

这里是代码:

public RepeatingThread rt; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Log.e(LOG_TAG, "Start Repeat Thread"); 
    //rt = new Thread(new RepeatingThread()); 
    rt = new RepeatingThread(); 
    rt.start(); 
    Log.e(LOG_TAG, "Started Repeat Thread"); 
} 

public class RepeatingThread implements Runnable { 

    private final Handler mHandler = new Handler(); 
    private int len = 0; 


    private byte[] input = new byte[len]; 


    public RepeatingThread() { 
     //try { 
     Log.e(LOG_TAG, "Before inputJSON String"); 
     //inputJSON = dataInputStream.readUTF(); 
     //URL url = new URL("tcp://23.23.175.213:1337"); 
     //inputJSON = dataInputStream.readUTF(); 
     //inputstrrd = new InputStreamReader(socket.getInputStream()); 
     String hello = "hello world"; 
     //String inputJSON = getStringFromBuffer(new InputStreamReader(socket.getInputStream())); 

     //Convert 
     Log.e(LOG_TAG, "After inputJSON String:" + inputJSON); 
     /*} 
     catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }*/ 

     //LOOK HERE FIRST 
     //inputJSON is what is received back from the server - Take the inputJSON 
     //String and use regular expressions HERE to remove all the other characters in the 
     //string except the payload JSON. 
     //refreshViewModels(inputJSON); 
    } 

    @Override 
    public void run() { 
     try { 
      Log.e(LOG_TAG, "IN REPEATINGTHREAD-INPUTJSON"); 
      //outputstrwr.write(outputJSONserv); //UNCOMMENT IF NEED TO SEND DATA TO GET JSON BACK 
      //inputJSON = ConvertByteArrayToString(getBytesFromInputStream(inputStr)); 
      inputJSON = ConvertByteArrayToString(getFileBytes(inputStr)); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     Log.e(LOG_TAG, "IN REPEATINGTHREAD-INPUTJSON2:" + inputJSON); 
     refreshViewModels(inputJSON); 
     mHandler.postDelayed(this, 3000);  
    } 
} 
+0

难道refreshViewModels()抛出一个异常? –

+0

我也想过,但它甚至没有达到那里,因为在REPATTINGTHREAD-INPUTJSON没有被打印出logcat。所以我不认为这是问题。 – user268397

回答

1

你应该使用一个Timer对于这种短期反复任务:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    TimerTask task = new RepeatingTask(); 
    Timer timer = new Timer(); 
    timer.scheduleAtFixedRate(task, 0, 3000); 
} 

public class RepeatingTask extends TimerTask { 

private int len = 0; 

private byte[] input = new byte[len]; 


public RepeatingTask() { 
    //try { 
     Log.e(LOG_TAG, "Before inputJSON String"); 
     //inputJSON = dataInputStream.readUTF(); 
     //URL url = new URL("tcp://23.23.175.213:1337"); 
     //inputJSON = dataInputStream.readUTF(); 
     //inputstrrd = new InputStreamReader(socket.getInputStream()); 
     String hello = "hello world"; 
     //String inputJSON = getStringFromBuffer(new InputStreamReader(socket.getInputStream())); 

     //Convert 
     Log.e(LOG_TAG, "After inputJSON String:" + inputJSON); 
    /*} 
    catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }*/ 

    //LOOK HERE FIRST 
    //inputJSON is what is received back from the server - Take the inputJSON 
    //String and use regular expressions HERE to remove all the other characters in the 
    //string except the payload JSON. 
    //refreshViewModels(inputJSON); 
} 

@Override 
public void run() { 
     try { 
      Log.e(LOG_TAG, "IN REPEATINGTHREAD-INPUTJSON"); 
      //outputstrwr.write(outputJSONserv); //UNCOMMENT IF NEED TO SEND DATA TO GET JSON BACK 
      //inputJSON = ConvertByteArrayToString(getBytesFromInputStream(inputStr)); 
      inputJSON = ConvertByteArrayToString(getFileBytes(inputStr)); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     Log.e(LOG_TAG, "IN REPEATINGTHREAD-INPUTJSON2:" + inputJSON); 
     refreshViewModels(inputJSON); 
} 

}

在代码中,你混的线程模式(从start()方法开始)和处理程序,这有点令人困惑。

+0

但是,我如何从onCreate()开始呢? – user268397

+0

我使用原始代码编辑我的答案 – fiddler

+0

我试过你的代码,但由于某种原因run()方法中的代码没有执行?你有什么想法可能会造成这种情况? – user268397

2

您需要延长线程,而不是实现Runnable接口:

public class RepeatingThread extends Thread{ 
//..... 
}