【问题标题】:I Can't use my findViewById from AsyncClass我无法使用来自 AsyncClass 的 findViewById
【发布时间】:2014-02-10 19:26:16
【问题描述】:

我无法使用我的 K1234562 中的findViewById()=(我该如何使用它?`

private class BackGroundTask extends AsyncTask<Void, Void, Void>{



    @Override
    protected Void doInBackground(Void... params) {
        try {
            //execute - means sending
        response =httpClient.execute(request);
        HttpEntity entity=response.getEntity();
        String str=EntityUtils.toString(entity);
        Log.v("Json=", str);
        //adding new response to our Response Class
        resp.addNewResponse(str);
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            Log.e(TAG, "Exception caught: ", e);
        }
        return null;
    }

    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        httpClient.getConnectionManager().shutdown();
        TextView textView = (TextView) findViewById(R.id.textView1);

        textView.setText("Done");
    }


  }
}

请写一个准确的代码。这个类在另一个 .java 文件中。不在MainActivity.java

【问题讨论】:

  • 任何涉及AsyncTask 中的操作的View 都是一个坏主意,因为AsyncTask 与视图没有任何关系,并且在如何与@987654327 通信方面具有不同的机制@。使用HandlerBroadcastReceiver 进行这种交流。
  • @NKN 从onPostExecute 更新用户界面很好。
  • @Simon 真的!不过这个只有doInBackground()结束后才有用,真不知道OP要解决什么样的问题...

标签: java android android-asynctask textview findviewbyid


【解决方案1】:

最简单的方法是根本不使用findViewById(),因为您在一个单独的文件中,这是一个Activity 方法。

您可以简单地使用interfaceonPostExecute() 中创建callback,并将String 结果发送回您的Activity。然后在您的callback 中,您可以根据需要简单地设置文本。

This answer gives an example of using an interface with AsyncTask

【讨论】:

    【解决方案2】:

    您可以将 Activity 上下文(YourActivity.this)传递给您的 AsyncTask 并使用 activity.findViewById(...);

    编辑 一些代码:

    添加到 AsyncTask:

    private Activity mActivity;
    
    public YourAsyncTask(Activity activity){
    this.mActivity = activity
    }
    
    ... 
    ....
    
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        httpClient.getConnectionManager().shutdown();
        if(mActivity!=null){
            TextView textView = (TextView) mActivity.findViewById(R.id.textView1);
        }
        textView.setText("Done");
    }
    

    【讨论】:

    • 如果你不明白 - 找一些 Java 课程 - 你真的需要它们)
    • 但是我怎样才能调用我的 AsyncTask(Activity 活动) ???我从另一个类中调用它 - BackGroundTask doItInBackGround = new BackGroundTask(); doItInBackGround.execute();
    • 这里需要写什么参数?
    • facepalm, bit.ly/1lxhnC1 你需要学习一些 OOP 原理和基本的 Java。传递变量是最基本的事情
    【解决方案3】:
    private Activity activity;
    

    在构造函数中:

    public BackGroundTask(Activity activity){
        this.activity=activity;
    }
    

    并在后期执行:

     protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        httpClient.getConnectionManager().shutdown();
        TextView textView = (TextView) activity.findViewById(R.id.textView1);
    
        textView.setText("Done");
    }
    

    如果从活动类调用创建新的背景类:

    BackGroundTask doItInBackGround = new BackGroundTask(this);
    

    如果在点击监听器或 Activity 调用中的任何类中:

    BackGroundTask doItInBackGround = new BackGroundTask(ActivityName.this);
    

    【讨论】:

    • 在活动类型的异步任务中声明一个属性,并从构造函数中设置它并在执行后使用它
    • 但是如果我添加构造函数,我该如何调用我的类?我打电话给 BackGroundTask doItInBackGround = new BackGroundTask(); doItInBackGround.execute();我现在怎么称呼它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多