2013-07-27 60 views
0

我無法理解屏幕方向更改後,我的後臺線程無法更改textView(txtName)的內容的原因。Android背景線程無法通過處理程序更改textview

如果我將txtname作爲靜態工作,但沒有靜態它不起作用。它的初始值沒有被後臺線程更新。

private TextView txtName; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.screen2); 

    txtName = (TextView) findViewById(R.id.txtName); 
    TextView txtEmail = (TextView) findViewById(R.id.txtEmail); 
    Button btnClose = (Button) findViewById(R.id.btnClose); 

    Button btnBack = (Button) findViewById(R.id.btnBack); 

    Intent i = getIntent(); 
    // Receiving the Data 
    String name = i.getStringExtra("name"); 
    String email = i.getStringExtra("email"); 
    // String data = i.getStringExtra("data"); 
    // Displaying Received data 
    txtName.setText("HI"); 
    txtEmail.setText(email); 

    // Binding Click event to Button 
    btnClose.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View arg0) { 
       //Closing SecondScreen Activity 
       Thread background = new Thread(new Runnable() { 
        @Override 
        public void run() { 
        for (int i = 0; i < 30; i++) { 
        try { 
         Thread.sleep(1000); 
         Message msg = new Message(); 
         Bundle b = new Bundle(); 
         b.putString("My Key", "My Value: " + String.valueOf(i)); 
         msg.setData(b); 
         // send message to the handler with the current message handler 
         handler.sendMessage(msg); 
         Log.e("Error", "IN THREAD"); 
         } catch (Exception e) { 
         Log.d("Error", e.toString()); 
        } 
        } 
        } 
       }); 
       background.start(); 
     } 
    }); 


    btnBack.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View arg0) { 
      Intent returnIntent = getIntent(); 
      returnIntent.putExtra("returnResult","i want to back page."); 
      setResult(RESULT_OK,returnIntent); 
      finish(); 

     } 
    }); 



} 








Handler handler = new Handler() { 

     public void handleMessage(Message msg) { 
     // get the bundle and extract data by key 
     Bundle b = msg.getData(); 
     String key = b.getString("My Key"); 
     txtName.setText("Item " + key); 
     txtName.setVisibility(View.VISIBLE); 
     Log.e("TEST MESSAGE", txtName.getText().toString()); 
     } 

    }; 

回答

0

嘗試runOnUiThread:

@Override 
public void onConfigurationChanged(Configuration newConfig){ 
    super.onConfigurationChanged(newConfig); 

    Handler handler = new Handler() { 
     public void handleMessage(Message msg) { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       // get the bundle and extract data by key 
       Bundle b = msg.getData(); 
       String key = b.getString("My Key"); 
       txtName.setText("Item " + key); 
       txtName.setVisibility(View.VISIBLE); 
       Log.e("TEST MESSAGE", txtName.getText().toString()); 
      } 
     }); 
     } 
    }; 
} 
+0

嗨感謝您的反饋,的擊打它不工作... – user2289495

+0

我編輯下面的例子中把你的代碼到onConfigurationChanged,依然採用runOnUiThread。 –

0

創建OnClickListener作爲固定類,然後應用它:

MyListener myListener = new MyListener(); 

btnClose.setOnClickListener(myListener); 

這樣的txtName變量musn't被設置爲最後的

0

您的用戶界面只能由UI線程更新。嘗試這樣的事情,讓你的UI線程儘快更新界面。這樣我認爲你可以避免使用處理程序。

btnClose.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View arg0) { 
       //Closing SecondScreen Activity 
       Thread background = new Thread(new Runnable() { 
        @Override 
        public void run() { 
        for (int i = 0; i < 30; i++) { 
        try { 
         Thread.sleep(1000); 
         final String val = "My Value: " + String.valueOf(i); 
         // ask UI thread to make the changes as soon as possible 
         txtName.post(new Runnable(){ 
        public void run(){ 
           txtName.setText("Item " + val); 
           txtName.setVisibility(View.VISIBLE); 
         }); 
         } catch (Exception e) { 
         Log.d("Error", e.toString()); 
        } 
        } 
        } 
       }); 
       background.start(); 
     } 
    });