2014-02-10 3 views
-2

Я не могу использовать findViewById() от моего Kclass = (Как я могу использовать? `я не могу использовать мой findViewById из AsyncClass

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

+0

Любое 'View' включая действия в файле' AsyncTask' это плохая идея, так как 'AsyncTask' не имеет ничего общего с взглядов и имеет различные механизмы взаимодействия с «Деятельностью». Используйте «Handler» или «BroadcastReceiver» для такого общения. – nKn

+0

@NKN Обновление пользовательского интерфейса из 'onPostExecute' в порядке. – Simon

+0

@Simon true! Но это можно использовать только после завершения 'doInBackground()', не знаю, какая проблема OP пытается решить ... – nKn

ответ

0

Вы можете передать контекст активности (YourActivity.this) к вашему AsyncTask и использовать activity.findViewById(...);

EDIT Часть кода:.

Добавить в 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"); 
} 
+0

можете написать любой код, как я могу это сделать? – Raqim

+0

да, мин, я добавлю его, чтобы ответить – Sam

+0

Если вы не понимаете - ищите некоторые уроки Java - вам они действительно нужны) – Sam

4

Проще всего было бы не использовать findViewById() вообще, так как вы находитесь в отдельном файле, и это Activity метод.

Вы можете просто использовать interface для создания в onPostExecute() в callback и отправить обратно String результат вашего Activity. Затем в вашем callback вы можете просто установить текст по своему усмотрению.

This answer gives an example of using an interface with AsyncTask

0
private Activity activity; 

и в конструкторе:

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

и в пост Execute:

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); 

Если в клик слушателя или любого класса внутри вызова активность:

BackGroundTask doItInBackGround = new BackGroundTask(ActivityName.this); 
+0

Я не понимаю этот код = ( – Raqim

+0

объявляет свойство в async-задании типа активности, а из конструктора задает его и в post-execute использует его –

+0

, но как я могу назвать свой класс if Я добавляю конструктор? Я называю вроде \t \t BackGroundTask doItInBackGround = new BackGroundTask(); doItInBackGround.execute() и как я могу его назвать сейчас? – Raqim