无法使用 AsyncTask 在 TextView 中设置文本

Posted

技术标签:

【中文标题】无法使用 AsyncTask 在 TextView 中设置文本【英文标题】:unable to set Text in TextView using AsyncTask 【发布时间】:2016-12-07 13:31:06 【问题描述】:

我有一个AsyncTask,我想在我的 layout.xml 文件中设置TextView 的文本,但是我的应用程序因错误而崩溃

android.content.res.Resources$NotFoundException: 字符串资源 ID #0x2

请帮帮我!

public class UploadVideo extends Activity 
    protected void onCreate(Bundle savedInstanceState) 
    
        
    super.onCreate(savedInstanceState);
    
        transferUtility = Util.getTransferUtility(this);
    
        requestWindowFeature(getWindow().FEATURE_NO_TITLE);
    
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
        setContentView(R.layout.my_activity);
    
    
        context = this;
    
    
        new get_people_data().execute();
    


    public class get_people_data extends AsyncTask<String,String,String>
    
    
        final String TAG = "get_people_data";
    
    
        String API_URL = "http://api.expressionsapp.com/users/auth0_5732cc152781665b7b5dfee6/status/";
    
        int front;
    
        int behind;
    
        @Override
    
        protected String doInBackground(String...arg0)
        
    
            try
    
            
    
                JsonParser jParser = new JsonParser();
    
                JSONObject json = jParser.getJSONFromUrl(API_URL);
    
                behind= json.getInt("countBack");
    
                front= json.getInt("countFront");
    
    
            catch (JSONException e)
            
    
                e.printStackTrace();
    
            
    
            return null;
    
        
    
    
        @Override
    
        protected void onPostExecute(String s)
        
    
            TextView ppl_infront;
    
            TextView ppl_behind;
    
            ppl_infront = (TextView) findViewById(R.id.ppl_infront);
    
            ppl_infront.setText(front);
    
            ppl_behind = (TextView) findViewById(R.id.ppl_behind);
    
            ppl_behind.setText(behind);
    
        
    
    

【问题讨论】:

首先声明TextView全局部分 请显示你的xml 在oncreate中初始化textview 您应该在onCreate() 中初始化您的小部件并在全局范围内声明它。 android.content.res.Resources$NotFoundException: String resource ID #0x0的可能重复 【参考方案1】:

问题出在

ppl_infront.setText(front);
 
ppl_behind.setText(behind);

因为你正在传递和 int(front is of type int) using

最终无效 setText(int resid)

然后系统在 R 文件中搜索该 int id(即自动生成的文件)

用这个改变:

ppl_infront.setText(String.valueOf(front));
      
ppl_behind.setText(String.vaueOf(behind));

使用

final void setText(CharSequence text)

这里是官方reference

【讨论】:

宾果游戏。你成功了!不错的收获。【参考方案2】:

做你的

ppl_infront = (TextView) findViewById(R.id.ppl_infront);


ppl_behind = (TextView) findViewById(R.id.ppl_behind);


在您的setContentView(R.layout.my_activity);
 下方的onCreate() 方法中

如果它不能解决您的问题,请发布您的 xml 文件。

【讨论】:

如果他使用这个,textview 必须是实例变量。为什么需要这个? 这不是保持全球性。如果他在onPostExecute() 中执行此操作,findViewById() 的上下文将是异步任务上下文。因此它可能会崩溃。 我怀疑那个人。因为,findViewById 仅在 Activity 上下文中运行。 AsyncTask 中没有 findViewById,因此它无法获取其上下文。 如果你能看到他的onPostExecute()方法,它包含findViewById()的textView。 我是说Android中的onPostExecute()方法没有findViewById()。因此,上面的代码仅在 Activity 上下文中运行,它确实具有该方法,因为它可以正确编译和运行。【参考方案3】:

快速解决方案:

如果你不想惹String.value(front),你可以设置你的文字如下。

ppl_behind.setText(front + "");

【讨论】:

快速解决方案但非常糟糕的编程建议!请不要遵循这种不良做法 那个伙伴有什么不好的?如果你能解释一下,可能会对我有所帮助。 好的,代码可以工作,但都是易读性和干净代码的问题。代码必须自己解释。连接一个空字符串只是一种解决方法。 好吧.. 对我来说,有效的东西是值得的。我认为您的代码不适合作为日志,因为它会影响您的应用程序性能。但我很高兴你指出。 我不这么认为,阅读这个有趣的blog 和这个SO post ...你会改变主意的!

以上是关于无法使用 AsyncTask 在 TextView 中设置文本的主要内容,如果未能解决你的问题,请参考以下文章

重新创建活动时如何从 AsyncTask 更新 TextView

在 AsyncTask 运行时向 TextView 添加文本

Android - JSON 到 textview 使用 asynctask

在扩展 AsyncTask 的类中使用 DoInBackground 方法更改非 MainActivity 的 Activity 中 TextView 的文本

在 AsyncTask 中将新的 TextView 设置为片段

处理从 asynctask 获取文本的 textview