Android Runnable让我的设备慢下来

时间:2012-12-11 15:07:24

标签: java android multithreading runnable

我正在尝试开发一个应用程序,该应用程序从HTML网页获取一些数据并每秒显示一次。

因为我正以这种方式使用runnable:

在OnCreate()方法中:

mHandler.removeCallbacks(mMuestraMensaje);
mHandler.postDelayed(mMuestraMensaje, 5000);

然后是另一种方法:

    private Runnable mMuestraMensaje = new Runnable() {
        public void run() {

           try {
            returned = test.GetSensorData(newString);
            rowTextView.setText(returned);
        } catch (Exception e) {
            e.printStackTrace();
        }
           mHandler.removeCallbacks(mMuestraMensaje);
           mHandler.postDelayed(this, 500);
        }
      };

问题在于,如果我按下后退按钮,例如,应用程序开始缓慢行动,直到我不强制关闭整个应用程序,设备运行速度太慢!

谢谢!

修改

这是全班:

public class HttpExample extends Title {




GetMethodEx test, moredata ;
String returned;
TextView rowTextView, rowTextView2;
LinearLayout ll;
private Handler mHandler = new Handler();
String newString;


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.httpexample);
    rowTextView = (TextView)findViewById(R.id.textView2);
    rowTextView2 = (TextView)findViewById(R.id.textView1);

    mHandler.removeCallbacks(mMuestraMensaje);
    mHandler.postDelayed(mMuestraMensaje, 5000);


    Bundle extras = getIntent().getExtras();
    newString = extras.getString("STRING_I_NEED");


    test = new GetMethodEx();
    moredata = new GetMethodEx();

    try {
        String name = moredata.GetName(newString);
        rowTextView2.setText(name);

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

    ScheduledExecutorService executor =
            Executors.newSingleThreadScheduledExecutor();

        executor.scheduleAtFixedRate(mMuestraMensaje , 0, 500, TimeUnit.MILLISECONDS );

}




    private Runnable mMuestraMensaje = new Runnable() {
        public void run() {

           try {
              returned = test.GetSensorData(newString);
           } catch (Exception e) {
              e.printStackTrace();
           }
           MainActivity.this.runOnUiThread(new Runnable(){
                 rowTextView.setText(returned);
           });
        }
      };

}

3 个答案:

答案 0 :(得分:1)

您的程序因为在GUI线程上运行线程而变慢。不建议这样做。但是,我注意到你完成后正在设置文本。这是你可以做的一些事情。

  1. 在另一个线程中运行传感器数据收集。通过runOnUiThread命令更新文本。
  2. 使用AsyncTask,这似乎是一个理想的情况。
  3. 对于这种不需要UI线程的常规事件,我建议使用ScheduledExecutorService
  4. 最简单的开始是第一个,但我会仔细看第二个选项。第一个选项是这样的:(注意,您需要将MainActivity替换为您的活动名称)

    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
    
    executor.scheduleAtFixedRate(mMuestraMensaje , 0, 500, TimeUnit.MILLISECONDS );
    
    private Runnable mMuestraMensaje = new Runnable() {
        public void run() {
    
           try {
              returned = test.GetSensorData(newString);
           } catch (Exception e) {
              e.printStackTrace();
           }
           MainActivity.this.runOnUiThread(new Runnable(){
                 rowTextView.setText(returned);
           });
        }
      };
    

答案 1 :(得分:0)

您可以使用HandlerHandlerThread附加到其他线程上。例如:

HandlerThread ht = new HandlerThread("nonUiThread");
ht.start();
Handler mHandler = new Handler(ht.getLooper());

但更优选的是,我建议你在案件中使用AsyncTask

答案 2 :(得分:0)

有了这个:

private Runnable mMuestraMensaje = new Runnable() {
    public void run() {

        try {
              returned = test.GetSensorData(newString);

           } catch (Exception e) {
              e.printStackTrace();
           }

        HttpExample.this.runOnUiThread(new Runnable(){

            @Override
            public void run() {
                // TODO Auto-generated method stub
                rowTextView.setText(returned.get(0)+returned.get(1));
                rowTextView2.setText(returned.get(2));


            }

       });

    }

    };