修改依赖于线程API调用的textviews?

时间:2015-08-19 16:27:05

标签: android multithreading riot-games-api

public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View theView = inflater.inflate(R.layout.match_layout, parent, false);
     matchID = getItem(position);

    TextView championName = (TextView) theView.findViewById(R.id.championNameText);
    new Thread(
            new Runnable() {
                public void run() {
                    selectedMatch = RiotAPI.getMatch(matchID);
                    Log.i(TAG, String.valueOf(selectedMatch)); // <-- returns the matches properly
                }
            }).start();

        championName.setText(String.valueOf(selectedMatch.getDuration()));


   // Log.i(TAG, String.valueOf(selectedMatch));  <-- returns nulls
    return theView;
}

在尝试制作我的第一个应用程序后,我遇到了问题。我的理解是我不允许在主线程中进行api调用,所以我尝试使用单独的线程。问题是,API返回数据需要几秒钟,因此当我尝试更新文本视图时,selectedMatch为null,给出了空指针异常。处理这个问题的正确方法是什么?

编辑:我到目前为止找到的唯一解决方法是将一个空的while循环等待线程先完成,但这似乎非常低效。希望得到更多的投入。

    public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View theView = inflater.inflate(R.layout.match_layout, parent, false);
     matchID = getItem(position);

    TextView championName = (TextView) theView.findViewById(R.id.championNameText);
    new Thread(
            new Runnable() {
                public void run() {
                    selectedMatch = RiotAPI.getMatch(matchID);
                    Log.i(TAG, String.valueOf(selectedMatch)); // <-- returns the matches properly
                }
            }).start();
     while (selectedMatch == null)
             {
             }
        championName.setText(String.valueOf(selectedMatch.getDuration()));


   // Log.i(TAG, String.valueOf(selectedMatch));  <-- returns nulls
    return theView;
}

1 个答案:

答案 0 :(得分:0)

尝试使用runOnUiThread():

ember-cli