2013-07-27 63 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(); 
     } 
    });