【问题标题】:Updating textview from onPostExecute从 onPostExecute 更新 textview
【发布时间】:2017-01-03 22:36:19
【问题描述】:

我正在尝试编写将从 Google Cloud 上的后端获取数据并作为端点返回的代码,从教程 Hello Endpoints 开始。https://cloud.google.com/appengine/docs/java/endpoints/helloendpoints-android-studio

我试图将结果作为文本视图而不是 Toast。我试过了

package com.example.username.textviews;

import android.content.Context;
import android.os.AsyncTask;
import android.support.v4.util.Pair;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

import com.example.neil.myapplication.backend.myApi.MyApi;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.extensions.android.json.AndroidJsonFactory;
import com.google.api.client.googleapis.services.AbstractGoogleClientRequest;
import com.google.api.client.googleapis.services.GoogleClientRequestInitializer;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private TextView t;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        t = (TextView) findViewById(R.id.response);
        new EndpointsAsyncTask().execute(new Pair<Context, String>(this, "Manfred"));
    }
}

class EndpointsAsyncTask extends AsyncTask<Pair<Context, String>, Void, String> {
    private static MyApi myApiService = null;
    private Context context;

    @Override
    protected String doInBackground(Pair<Context, String>... params) {
        if(myApiService == null) {  // Only do this once
            MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(),
                    new AndroidJsonFactory(), null)
                    // options for running against local devappserver
                    // - 10.0.2.2 is localhost's IP address in Android emulator
                    // - turn off compression when running against local devappserver
                    .setRootUrl("http://10.0.2.2:8080/_ah/api/")
                    .setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() {
                        @Override
                        public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException {
                            abstractGoogleClientRequest.setDisableGZipContent(true);
                        }
                    });
            // end options for devappserver

            myApiService = builder.build();
        }

        context = params[0].first;
        String name = params[0].second;

        try {
            return myApiService.sayHi(name).execute().getData();
        } catch (IOException e) {
            return e.getMessage();
        }
    }

    @Override
    protected void onPostExecute(String result) {
        //Toast.makeText(context, result, Toast.LENGTH_LONG).show();
        t.setText(result);
    }
}

我已将@+id/response 的必要行添加到activity_main.xml 和响应strings.xml。

它不会从 onPostExecute() 中识别 t,也根本无法使用 findViewById。

当我怀疑这一点时,我需要从数据存储中检索,即。 field1 到 textfield1 等。

【问题讨论】:

    标签: android google-app-engine android-asynctask textview


    【解决方案1】:

    在执行导致 TextView 或其他小部件重新显示的操作时,您需要在 UI 线程上。我个人没有使用过 onPostExecute(),但使用过其他类似的 API。

    这是一种方法:

    t.post (new Runnable()
    {
      @Override public void run()
      {
        t.setText (result);
      }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多