2012-08-03 5 views
1

내 응용 프로그램에서 모바일 데이터의 사용 가능 여부를 확인하려고합니다.스레드 루프를 만드는 가장 좋은 방법은 무엇입니까?

버튼을 클릭하면 제대로 작동하지만 클릭 한 번만 정보를 새로 고치고 "실시간"으로 자동으로 새로 고칩니다.

threadCheck = new Thread(new Runnable() { 

     public void run() { 
      // TODO Auto-generated method stub 

       try { 
        setTextfield(isMobileDataEnabled()); 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 

    }); 



    this.startbutton.setOnClickListener(new OnClickListener() { 

     public void onClick(View arg0) { 

      threadCheck.run(); 

     } 

    }); 

이 스레드를 "루프"로 만드는 가장 좋은 방법은 무엇입니까? isMobileDataEnabled()를 재귀 적으로 호출하려고 시도했지만 stackoverflow 오류가 발생했습니다.

는 근, WOLFEN는

답변

2

나는 당신의 최선의 방법은 실제로 ConnectivityManager 방송 청취자가 될 것입니다 생각합니다. 네트워크 사용 가능 여부를 알려줍니다. 방송에 등록하고 청취자에서 버튼을 업데이트하십시오. 이렇게하면 루프가없고 CPU가 대부분 유휴 상태로 남습니다. 네트워크가 변경되면 폴링이 필요없이 브로드 캐스터에 알립니다. 그것은 매우 빠르므로 "실시간"에 대해 걱정하지 않을 것입니다.)

다음은 사용자가 시작하는 데 도움이 될 것입니다.

http://developer.android.com/reference/android/net/ConnectivityManager.html

public class MyActivity extends Activity { 

    public void onCreate(Bundle b) { 
     mButton = (Button) findViewById(R.id.button); 
     registerReceiver(mBroadcastReceiver, new IntentFilter(ConnectivityMananger.CONNECTIVITY_ACTION)); 
     ..... 
    } 
    BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      if (ConnectivityMananger.CONNECTIVITY_ACTION.equals(intent.getAction()) { 
       boolean connectionLost = !intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 
       mButton.setText("Network Enabled:" + ! connectionLost); 
       // or whatever else you want to callback. 
      } 
     } 
    }; 
+0

http://developer.android.com/reference/android/content/BroadcastReceiver.html

모바일 데이터 상태가 변경되었는지 여부를 정보를 얻으려면, 당신은 반사 사용해야합니다 : 방법 m = c.getDeclaredMethod ("getMobileDataEnabled을"); 나는 이것이 ConnectivityManager와 함께 작동하지 않을 것이라고 생각합니다. – Wolfen

+0

왜 반사 방식이 필요합니까? 몇 가지 예제 코드로 내 대답을 업데이트 할 것입니다. –

+0

나는 당신의 코드를 기다리고 있습니다. 고마워요 :) – Wolfen

0
public void run() { 
      // TODO Auto-generated method stub 

       try { 

while (isMobileDataEnabled()) { 
      // do something in the loop 
      } 

} catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 

    }); 
+0

감사합니다. 그러나 이것은 모바일 데이터가 활성화되어 있지 않을 때 스레드를 멈 춥니 다. 따라서 모바일 데이터를 끄고 다시 활성화하면 더 이상 작동하지 않습니다. – Wolfen

관련 문제