我的Android应用程序中的线程错误

时间:2014-03-23 10:34:58

标签: android orientation crash-reports

每当我更改方向时,线程都会出错,我的应用程序会意外关闭。

这是错误代码

03-23 11:25:40.021: W/dalvikvm(27571): threadid=14: thread exiting with uncaught exception (group=0x40cecae0)
03-23 11:25:40.021: E/AndroidRuntime(27571): FATAL EXCEPTION: Thread-11869
03-23 11:25:40.021: E/AndroidRuntime(27571): java.lang.NullPointerException
03-23 11:25:40.021: E/AndroidRuntime(27571): at my.app.Methods$1.run(Methods.java:34) 

这是线程的代码:

SettingsPreferences mSettingsPreferences = new SettingsPreferences(mContext);
public void loadStatistic (final ProgressBar progBar, final SettingsPreferences settPref, final String max, final String progress, final int defaultValue) {
        Thread t = new Thread () {
            public void run() {
                try {
                    sleep(100);
                    progBar.setMax(settPref.getInt(max, defaultValue));
                    progBar.setProgress(settPref.getInt(progress, defaultValue));
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
        t.start();
    }

2 个答案:

答案 0 :(得分:0)

您必须更新主线程或UI线程上的所有UI元素。我建议创建一个AsyncTask子类,然后实现onPreExecuteonPostExecute来启动和停止进度条或测量时间。然后在runOnUiThread上执行所有UI操作。 runOnUiThread将Runnable作为参数,这样您就可以完成您心中所需的一切

答案 1 :(得分:0)

这是因为您试图在单独的线程上访问UI。您将需要使用AsyncTask线程,这将使您能够定期访问UI线程。

例如:

private class ExampleThread extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {}

    @Override
    protected void doInBackground(Void... params) {
         while(!isCancelled()) { // Keep going until cancelled
             try {
                 Thread.sleep(100); // Delay 100 milliseconds
             } catch (InterruptedException e) {
                 Thread.interrupted();
             }
             publishProgress(); // Run onProgressUpdate() method
             if(isCancelled()) break; // Escape early if cancel() is called
         }

    }

    @Override
    protected void onPostExecute(Void... params) {}

    @Override
    protected void onProgressUpdate(Void... params) {
        // Here you can access the UI thread
        progBar.setMax(settPref.getInt(max, defaultValue));
        progBar.setProgress(settPref.getInt(progress, defaultValue));
    }
}

启动帖子:

ExampleThread thread = new ExampleThread();
thread.execute();

停止线程:

thread.cancel();

可以在this question上找到有关AsyncTask的更多信息和示例。