此帖子底部的代码由以下代码行触发。
new MasterClickAsyncTask(main).execute(position);
下面代码的doInBackground部分调用包含for循环的方法,因此需要Looper.prepare()。
此代码在调用前几次运行正常,但随后会抛出以下错误:
10-15 22:50:24.752:ERROR / AndroidRuntime(9258):引起:java.lang.RuntimeException:每个线程只能创建一个Looper
我尝试过放置Looper.getMainLooper()。quit();和AsyncTask的各个部分中的其他一些事情,但这只会立即崩溃。
任何帮助?
代码:
import java.io.IOException;
import java.net.MalformedURLException;
import org.json.JSONException;
import android.os.AsyncTask;
import android.os.Looper;
import android.view.View;
public class MasterClickAsyncTask extends AsyncTask<Integer, Void, Void> {
Master selectedMaster;
Main main;
MasterGridView masterGridView;
Integer i;
DiscogProxy discogProxy = new DiscogProxy();
MasterClickAsyncTask(Main main){
this.main = main;
this.masterGridView = main.getMasterGridView();
}
@Override
protected void onPreExecute() {
main.progressBar.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Integer... params) {
masterGridView.getSelectedView();
Globals.selectedMaster = (Master)(masterGridView).getItemAtPosition(params[0].intValue());
Globals.selectedMaster.getVersionListView().getVersionList().clear();
Looper.prepare();
try {
Globals.selectedMaster.getVersionListView().populateVersionList();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//Looper.getMainLooper().quit();
return null;
}
@Override
protected void onPostExecute(Void result) {
main.populateAlbumVersionsView();
main.progressBar.setVisibility(View.GONE);
}
}
答案 0 :(得分:4)
Looper与for循环无关。 Looper是控制UI线程的Android系统的一部分。如果没有准备好弯针,有几件事情是行不通的,但总的来说,除非绝对必要,否则最好避免使用Looper.prepare();
。最好使用异步doInBackground
执行数据处理或其他更长时间的操作,然后使用onPostExecute
和onProgressUpdate
更新UI。
简而言之,除非您以某种方式使用UI,否则您无需调用Looper。如果您发现自己必须调用Looper,则可能需要重新构建后台线程的工作方式。