2014-01-13 42 views
0

我有一个启动画面与TextView来显示应用程序正在做什么,如“更新库”...“更新航运”等。我使用AsyncTask通过API更新我的数据库。在Android中,如何从AsyncTask中更改TextView?

我将更新文本传递给AsyncTask。我需要更改TextView statusMessage中的文字。我试图做到这一点:

public class JSONParser extends AsyncTask<String, String, JSONObject> { 

    static InputStream is = null; 
    static JSONObject json = null; 
    static String outPut = ""; 

    TextView statusMessage; 

    @Override 
    protected void onPreExecute() { 
     statusMessage = (TextView) findViewById(R.id.statusMessage); 

    } 

... 

我的计划是更改doInBackground法的文本,但findViewById不在的AsyncTask访问。我想我需要使用setContentView来允许findViewById工作,但我不知道如何。

我的Java文件SplashScreen.java和我的XML是activity_splash_screen.xml

----- -----编辑

欲了解更多的信息,我有三件互相交谈:

闪屏.java - >调用baseActivity.java中的方法 - >方法将数据发送到JSONParser.java - >从API将解析的JSON发送到baseActivity.java以更新数据库

根据以下建议我宣布了

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

在baseActivity.java的onCreate因为它是文件调用的AsyncTask。

在JSONParser.java我做这个,现在:

public class JSONParser extends AsyncTask<String, String, JSONObject> { 

    static InputStream is = null; 
    static JSONObject json = null; 
    static String outPut = ""; 

    TextView statusMessage; 

    @Override 
    protected JSONObject doInBackground(String... params) { 
     // TODO Auto-generated method stub 
    ... 
    } 


    protected void onProgressUpdate() { 
     statusMessage.setText("testing"); 
    } 

    protected void onPostExecute(JSONObject result) { 


    } 
} 

我只是用“测试”还有用于测试目的。

+0

您可以使用Handler更新TextView(需要在UI线程上发布更新)。 – mbmc

+0

问题已更新 – dcp3450

回答

3

我的计划是改变文本的doInBackground

坏计划!您无法从背景Thread更新UI。您需要在onPostExecute()onProgressUpdate()中执行此操作。

但在AsyncTask中无法访问findViewById。

如果这是一个内部类的Activity的初始化,然后在ActivityView然后按上述方法在你的任务更新。

如果是自己的文件,那么你将要使用的interface并有回调到AcitivtyonPostExecute()onPreExecute(),或onProgressUpdate()。你可以看到一个in this SO answer的例子。

我想我需要使用的setContentView允许findViewById

非也!但是,如上所述,请在执行此任务之前执行此操作,例如您的ActivityonCreate()

编辑

onProgressUpdate()需要param但你onProgressUpdate()不那么它是不一样的方法。这就是为什么当你有@Override这是注释点时,它会抱怨。它抱怨,你知道你想要重写一个方法,所以你知道它有什么问题。

将其更改为

protected void onProgressUpdate(Void...values) { 
    statusMessage.setText("testing"); 
} 

onProgressUpdate()链接

http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress...)

+0

我已经用最近的更改更新了这个问题。但是,文字尚未更改。我错过了一件? – dcp3450

+1

是的,我没有看到'statusMessage'在任何地方初始化。无论如何,您需要使用我链接的回调/接口方法,或者使'AsyncTask'成为您的初始'Acitivity'的内部类。 – codeMagic

+0

我在调用了JSONParser.java中的AsyncTask的“baseActivity.java”的onCreate中初始化它。我尝试初始化JSONParser.java,但那是我遇到问题的地方。 – dcp3450

0
I think I need to use setContentView to allow findViewById to work but I'm not sure how. 

是的。您需要在onCreate中使用setContentView(R.layout.activity_splash_screen)

您可以在onCreate中初始化您的视图,使asynctask成为内部活动类,并在onPreExecute中更新ui。

TextView statusMessage; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_splash_screen); 
    statusMessage = (TextView) findViewById(R.id.statusMessage); 
} 

此外,您可以使用progressdialog并显示消息。我认为使用progressdialog会比textview更好。您可以在doInbackground发布进展和onProgressUpdate更新进度对话框()

http://developer.android.com/reference/android/os/AsyncTask.html

+0

我没有在启动画面活动中调用AsycnTask。我更新/编辑了更详细的问题。 – dcp3450

+0

@ dcp3450或者让它成为一个内部类或使用接口回调活动并更新活动中的UI – Raghunandan

1

您应该使用onProgressUpdate,该方法具有存取权限的UI线程。

public class yourAsync extends AsyncTask<> { 

    @Override 
    protected void onProgressUpdate() { 
    textView.setText(); 
    } 

} 
+0

ADT要我删除@ @ Override' – dcp3450

0

把这样的事情在你的活动

处理器statusUpdateHandeler =新的处理程序()....... 。

在你的th阅读,致电处理程序(发送消息)

MainActivity.statusUpdateHandler.sendEmptyMessage(1);

在您的实际处理程序代码中,设置状态消息。

相关问题