好吧,这让我发疯了。我有一个工作线程(网络调用),它需要与 UI 线程分开运行(它实际上是一个 ThreadPoolExecutor,但我简化了它以证明我的观点)。如果您以纵向运行此代码,不进行旋转,则文本会更新。我在那里进行了延迟,以便轮换显示我的问题。如果您从纵向开始并且在文本更新旋转到横向之前,文本不会更新。如果您评论代码,您可以看到侦听器触发但文本永远不会更新。
我正在尝试模拟在单独的线程中运行的自定义网络调用,如果用户在两者之间旋转可能需要一些时间才能恢复,然后数据会丢失。我们正在尝试防止多次网络调用以节省手机上的数据使用量。
package com.example.test;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.content.res.Configuration;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int orientation = getResources().getConfiguration().orientation;
if (Configuration.ORIENTATION_LANDSCAPE == orientation) {
//Do SomeThing; // Landscape
} else {
startBackgroundWork();
//Do SomeThing; // Portrait
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private Handler mHandler = new Handler();
public void startBackgroundWork() {
new WorkingThread(new SomeListener() {
public void onSomethingDone(final Object result) {
mHandler.post(new Runnable() {
public void run() {
((TextView)findViewById(R.id.text)).setText((String)result);
//showMyDialog(result);
}
});
}
}).start();
}
public interface SomeListener {
public void onSomethingDone(Object result);
}
public class WorkingThread extends Thread {
private SomeListener mListener;
public WorkingThread(SomeListener listener) {
mListener = listener;
}
public void run() {
/* do some work */
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mListener.onSomethingDone("New Text");
}
}
}