gpt4 book ai didi

java - 异步任务后无法更改文本

转载 作者:行者123 更新时间:2023-12-02 05:40:13 25 4
gpt4 key购买 nike

我正在开发 Android 应用程序。它使用异步任务连接到互联网并获取 JSON 结果。之后,它将值保存到私有(private)字符串变量中。此任务与 fragment 类中的按钮监听器一起使用。单击按钮后,异步任务执行。下一个命令是将Text 设置为TextView。异步任务运行良好,但没有出现任何内容。如果我开始偏好 Activity 然后再回来,它就在那里。所以它有效但没有出现。也许我必须“重新绘制”屏幕,但我不知道该怎么做。或者其他一些想法?请帮忙。

我在 Eclipse/Android studio 中创建了基本的 android 项目,其中有 MainActivity 类,PlaceholderFragment 类扩展了 Fragment(XML 中没有 Fragment 标签 - Activity_main.xml 是 FrameLayout,fragment_main.xml 是 Linear Layout)。首先类 PlaceholderFragment 是内部静态类,但我将其放在单独的 .java 文件中。看看我的代码,我试图简化它:

MainActivity.java

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

// URL to get JSON
private static String pref_url;
private static String pref_key;
private static String pref_check;

private String status = " ";

private static final String PARAM_KEY = "key";
private static final String PARAM_CODE = "code";
private static final String PARAM_CHECK = "check";

// JSON Node Names
private static final String TAG_STATUS = "status";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}

public void btnDoIt() {
new JSONParse().execute();
}

public String getStatus() {
return status;
}

public String createUrl() {
String url = pref_url + "?" + PARAM_KEY + "=" + pref_key + "&"
+ PARAM_CODE + "=" + Code + "&" + PARAM_CHECK + "="
+ pref_check;
return url;
}

private class JSONParse extends AsyncTask<String, String, JSONObject> {
private ProgressDialog pDialog;

@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Getting Data ...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();

}

@Override
protected JSONObject doInBackground(String... args) {

// Getting JSON from URL

JSONParser jParser = new JSONParser();
JSONObject json = jParser.getJSONFromUrl(createUrl());

return json;

}

@Override
protected void onPostExecute(JSONObject json) {
pDialog.dismiss();
try {
// Storing JSON item in a Variable
String vypis_key = json.getString(TAG_KEY);
status = json.getString(TAG_STATUS);

Toast toast = Toast.makeText(getApplicationContext(),
"//KEY = " + vypis_key, Toast.LENGTH_LONG);
toast.show(); //it writes KEY = OK

} catch (JSONException e) {
e.printStackTrace();
}
}
}

PlaceholderFragment.java

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class PlaceholderFragment extends Fragment {

View rootView;
Button btngetdata;


public PlaceholderFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

rootView = inflater.inflate(R.layout.fragment_main, container, false);

btngetdata = (Button) rootView.findViewById(R.id.btnUplatni);
btngetdata.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MainActivity) getActivity()).btnDoIt();
setTextInTextView(getString(R.string.text_status) + " " + ((MainActivity) getActivity()).getStatus(), R.id.textstatus);
}
});

return rootView;
}


@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
setTextInTextView(getString(R.string.text_status) + " " + ((MainActivity) getActivity()).getStatus(), R.id.textstatus);
}

public void setTextInTextView(String text, int id) {
TextView textView = (TextView) rootView.findViewById(id);
textView.setText(text);
}

fragment_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.zonemedia.skener.PlaceholderFragment" >

<TextView
android:id="@+id/textstatus"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/text_status" />

<Button
android:id="@+id/btnUplatni"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/btn_Uplatni" />

</LinearLayout>

activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.zonemedia.skener.MainActivity"
tools:ignore="MergeRootFrame" >

最佳答案

问题是您在 onclick() 中执行了以下操作

       ((MainActivity) getActivity()).btnDoIt();
setTextInTextView(getString(R.string.text_status) + " " + ((MainActivity) getActivity()).getStatus(), R.id.textstatus);

当执行第二条指令时,第一条指令(异步任务)仍在执行。

我建议您使用 Activity 中的状态创建一个回调,并在 asynctask 的 onPostExecute 中调用它,然后在此回调中更改 TextView 。

关于java - 异步任务后无法更改文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24585420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com