2

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

为此,我以这种方式使用可运行对象:

在 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);
           });
        }
      };

}

4

3 回答 3

1

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

  1. 在不同的线程中运行传感器数据收集。runOnUiThread通过命令更新文本。
  2. 使用AsyncTask,这似乎是一个理想的情况。
  3. 对于这种不需要 UI 线程的常规事件,我建议使用ScheduledExecutorService

最简单的开始是第一个,但我会仔细研究第二个选项。第一个选项是这样的:(注意,您需要将 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);
       });
    }
  };
于 2012-12-11T15:14:42.403 回答
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));


            }

       });

    }

    };
于 2012-12-11T18:54:55.390 回答
0

您可以Handler使用HandlerThread. 例如:

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

但更可取的是,我建议您AsyncTask在您的情况下使用。

于 2012-12-11T15:17:44.337 回答