gpt4 book ai didi

android - 每个线程只能创建一个 Looper

转载 作者:行者123 更新时间:2023-11-29 16:13:13 26 4
gpt4 key购买 nike

我有一个在互联网上请求数据信息的应用程序(客户端-服务器应用程序),但是这种通信非常慢,因此我决定创建一个 AsyncTask 来管理延迟。在 doInBackground 中,我调用了 Looper.prepare() 然后是我的“ View 生成器(检索数据)”。

详细(问题):

我有一个动态创建 ListView 行的 Activity 。但每次我尝试膨胀行时,android 都会抛出一个 Looper 异常“每个线程只能创建一个 Looper”

我遵循了以下步骤:

  • 调用Looper.preapare()
  • 使用第一次膨胀来创建我的列表的容器
  • 使用第二次膨胀创建列表行

我想我不能充气两次,但我不知道该如何解决

异步任务

private class DrawerView extends AsyncTask<ActivityGroup, String, View>{
Exception exc=null;

@Override protected void onPreExecute() {
super.onPreExecute();
}

@Override protected View doInBackground(ActivityGroup... params) {
try {
Looper.prepare();
return processAct();
}catch (ConnectionException e) {
exc =e;
return null;
}
catch (Exception e) {
exc = e;
return null;
}
}

@Override protected void onPostExecute(View result) {
super.onPostExecute(result);
if(exc!= null){
Utils.usrMessage(getApplicationContext(), "Oh Noo!:\n"+exc.getMessage());
Utils.logErr(getApplicationContext(), exc);
finish();
}
if(result!= null){
setContentView(result);
}
}
}

processAct()就是这样实现的抽象方法

@Override protected View processAct() throws Exception {

Bundle bundle = getIntent().getExtras();
User user = (User)bundle.getSerializable("user");

Team team = Team.getTeamInformation(this,user.getTeamId());
ArrayList<Player> players =Player.getPlayerList(this,user.getTeamId());

PlayersListAdapter view = new PlayersListAdapter(this,players,team);
return view;
}

PlayerListAdapter 是构建/设置第一个 View (列表容器)的类..这里是第一个膨胀

public PlayersListAdapter(Context context, ArrayList<Player> players,Team team) throws Exception{
super(context);
View view = inflate(getContext(), R.layout.team_players, this);

TextView tv_teamName = (TextView)view.findViewById(R.id.tbplrs_tmnm);
TextView tv_playersNum = (TextView)view.findViewById(R.id.tbplrs_nplrs);

tv_teamName.setText(team.getName());

String msg = players.size()+" ";
msg += (players.size()!=1)?context.getString(R.string.playerPlural):context.getString(R.string.playerSingle);
tv_playersNum.setText(msg);

ListView lView = (ListView)view.findViewById(R.id.tbplrs_plrslst);
PlayersRowListAdapter plAdapter = new PlayersRowListAdapter(context, players);
lView.setAdapter(plAdapter);
}

最后 PlayerRowListAdapter 扩展了 BaseAdapter,...这里是第二次膨胀

@Override public View getView(int position, View view, ViewGroup parent) {
if (view == null){
LayoutInflater lInflator = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = lInflator.inflate(R.layout.team_player_singlplayer,null);
}
....
....
}

注意如果我放下第二个适配器 PlayerRowListAdapter...一切正常...(显然没有列表)

问候

附注对不起我的英语

最佳答案

而不是仅仅调用 Looper.prepare();,首先检查您的 Thread 是否不存在 Looper,如果不存在,则调用该函数。像这样:

if (Looper.myLooper()==null)
Looper.prepare();

关于android - 每个线程只能创建一个 Looper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11470472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com