2016-07-19 3 views
-1

ハンドラの仕組みを理解するための例を作成しようとしています。コードbelwoに示されているように、私は永続的に実行され、変数iをインクリメントするworkerThreadを作成しました。 run()メソッド内で、ハンドラクラスの本文に示すように、インクリメントされた変数の値をTextViewに渡したいとします。sendMessage()が定義されていません

問題は、「新しいハンドラ()」であり、「handler.sendMessage(m)は」赤

でマークされた行は、私はこの問題に

を解決する方法を教えてください、ですMainActivity

public class MainActivity extends AppCompatActivity { 

private final static String TAG = MainActivity.class.getClass().getSimpleName(); 
private TextView mtvIncr = null; 

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

    this.mtvIncr = (TextView) findViewById(R.id.tvValue); 
    new WorkerThread().start(); 
} 

Handler handler =new Handler() {//ERROR 
    @Override 
    public void handleMessage(Message msg) { 
     int sentInt = msg.getData().getInt("what"); 
     mtvIncr.setText("r:"+Integer.toString(sentInt)); 
    } 
}; 

class WorkerThread extends Thread { 

    private int i = 0; 
    android.os.Handler mHandler = null; 

    @Override 
    public void run() { 
     super.run(); 

     Looper.prepare(); 

     while(true) { 
      Log.d(TAG, SubTag.bullet("WorkerThread", "i: " + (i++))); 
      SystemClock.sleep(1000); 

      Message m = new Message(); 
      Bundle b = new Bundle(); 
      b.putInt("what", i); // for example 
      m.setData(b); 
      handler.sendMessage(m);//ERROR 
     } 
    } 
} 
} 
+1

可能な重複します(http:// stackoverflowの.com/questions/36215126/myhandler-obtainmessage-is-not-in-service-in-in-android) –

+0

私も同じ質問だと信じています。 – W0rmH0le

答えて

0

使用Message.obtain()は、Messageオブジェクトを取得し

Messageのコンストラクタはpublicですが、 のいずれかを取得する最も良い方法は、Message.obtain()または Handler.obtainMessage()メソッドの1つを呼び出して、 リサイクルオブジェクトのプールからそれらを取得することです。

そしてobj属性msg.obj = b;

OBJ使用:受信者に送信する任意のオブジェクトを。

情報から:

https://developer.android.com/reference/android/os/Message.html

例:

Handler handler =new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     int sentInt = ((Bundle)msg.obj).getInt("what"); 
     mtvIncr.setText("r:"+Integer.toString(sentInt)); 
    } 
}; 


class WorkerThread extends Thread { 

    private int i = 0; 
    android.os.Handler mHandler = null; 

    @Override 
    public void run() { 
     super.run(); 

     Looper.prepare(); 

     while(true) { 
      Log.d(TAG, SubTag.bullet("WorkerThread", "i: " + (i++))); 
      SystemClock.sleep(1000); 

      Message msg = Message.obtain(); 
      Bundle b = new Bundle(); 
      b.putInt("what", i); // for example 
      msg.obj = b; 
      handler.sendMessage(msg); 
     } 
    } 
} 
[myHandler.obtainMessage()はアンドロイドでのサービスクラスで許可されていません]の
関連する問題