2014-11-11 5 views
-1

나는 3 초마다 서버에 데이터를 보내야하며,이 프로세스를 시작 또는 중지하기 위해 손을 든다. 이렇게 스레드를 만들었습니다.스레드가 다시 시작될 때

class updaterunner implements Runnable { 
     // @Override 
     public void run() { 
      while (threadex) { 
       try { 
        doWork(); 
        Thread.sleep(30000); 
       } catch (InterruptedException e) { 
        Thread.currentThread().interrupt(); 
       } catch (Exception e) { 
       } 
      } 
     } 

     public void doWork() { 

      runOnUiThread(new Runnable() { 

       public void run() { 
        new startasynch().execute(); 

       } 
      }); 
     } 
    } 

thradex이 거짓으로 초기화되는

시작 버튼이 함수 호출

:

threadex = true; 

if (myThread.getState() == Thread.State.NEW) 
{ 
    myThread.start(); 
} 

그리고 정지 버튼입니다 이 전화 :

threadex = false; 

첫 번째 시작 중지가 잘 작동 잘 작동하지만, 내가 그것을 나던 작업을 다시 시작했는데, 내가 스레드의 상태를 확인 할 때, 내가 그것을 .. TERMINATED 발견했을 때 어떤 날이 설명 할 수 제발?

+0

정확히 작동하지 않습니다. 아무 것도하지 않으면 중지 버튼을 클릭하십시오. 30 초마다 작동합니까? – hasan83

+0

'run' 메소드의 코드는'threadex'가'false'로 설정되면 끝납니다. 그래서 스레드가 종료되었습니다. 새로운 것이 아닐지라도 마술처럼 '새로운 것'으로 다시 돌아갈 것이라고 기대 했습니까? – ajb

+0

그래서 당신은 스레드를 만들고 있는데, 유일한 목적은 UI 스레드로 돌아가 거기에서 비동기 작업을 시작하는 것입니다 ...!? – ElDuderino

답변

0

A (big-T) Thread 객체는 (약간 t) 스레드의 수명주기를 관리합니다. (작은 t) 쓰레드는 "다시 시작할 수있는"것이 아닙니다. 이 단어는 아무 의미도 없습니다. myThread.start()를 호출하면 약간의 스레드가 생겨 run() 메서드가 반환 될 때 스레드가 사라집니다. 더 이상 존재하지 않는 것을 다시 시작할 수 없습니다.

Java 라이브러리 개발자는 스레드에 대한 생각을 반영하여 big-T Thread 클래스를 설계했습니다. 새로운 little-t 쓰래드를 만들고 싶다면 (이전의 것을 수행 할지라도), 새로운 big-T 쓰래드를 생성하여이를 관리해야합니다.

+0

도움을 주셔서 감사합니다, 지금 이해했습니다 – Asmaa

0

나는 안드로이드를 사용하는 것이 훨씬 쉬운 해결책이라고 생각한다. AsyncTask. 비동기 작업을 수행하고 필요한 모든 콜백을 제공하여 UI 스레드를 자유롭게 유지합니다. 다음과 같이 보일 것입니다 :

package com.example.asynctasktest; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 


public class MainActivity extends Activity { 

    private MyAsyncTask backgroundTask; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    public void onButtonPressStopThread(View v){ 
     backgroundTask.cancel(false); 
    } 

    public void onButtonPressStartThread(View v){ 
     startThread(); 
    } 

    public void startThread(){ 
     backgroundTask = new MyAsyncTask(); 
     backgroundTask.execute(); 
    } 

    public class MyAsyncTask extends AsyncTask<Void, Void, Void>{ 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       Thread.sleep(30000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      //Send data to server 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      startThread(); 
     } 
    } 
} 

EDIT : 스레드 실행을 시작하고 중지하기위한 버튼 클릭이 추가되었습니다.

+0

고맙습니다 디 보그 – Asmaa

관련 문제