每当我更改方向时,线程都会出错,我的应用程序会意外关闭。
这是错误代码
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();
}
答案 0 :(得分:0)
您必须更新主线程或UI线程上的所有UI元素。我建议创建一个AsyncTask
子类,然后实现onPreExecute
和onPostExecute
来启动和停止进度条或测量时间。然后在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的更多信息和示例。