当前位置: 首页 > 知识库问答 >
问题:

Android Asynctask:应用程序可能在其主线程上做了太多工作

阎烨
2023-03-14

我的代码可以工作,但我在监视器中有一条异常消息:我/编舞:跳过了37帧!应用程序可能在其主线程上做了太多工作。

我知道这个错误消息意味着我在用户界面线程中做了很多繁重的处理。问题是对我来说,除了向列表视图添加假数据,我在用户界面线程上几乎什么都不做。我正在使用Asyncask发出一个应用编程接口请求,这是我正在做的唯一的“繁重”工作,它不在主线程中。

我把我所有的代码放在这里,但我认为大部分都不是问题,因为当我注释我所有的假数据代码和调用我的Asyncask时,我仍然有这个问题。所以我想问题更多的是我如何使用这个片段,因为我从来没有使用过,所以我肯定在任何地方都犯了一个错误...

//==== list_item_forecast.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:gravity="center_vertical"
    android:id="@+id/list_item_forecast_textview" />

//====fragment_main.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- using a FrameLayout because only one child element -->
<FrameLayout     xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listview_forecast"/>
</FrameLayout>

//==== content_main.xml
<fragment     xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fragment"
    android:name="com.example.android.sunshine.app.MainActivityFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:layout="@layout/fragment_main" />


//==== MainActivity
public class MainActivity extends AppCompatActivity implements ForecastRequest {

    private static String appId = "";
    // Will contain the raw JSON response as a string.
    String forecastJsonStr = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // Get OpenWeather API key
        appId = getResources().getString(R.string.APPID);

        try {
            // Construct the URL for the OpenWeatherMap query
            // Possible parameters are avaiable at OWM's forecast     API page, at
        // http://openweathermap.org/API#forecast
            String url =     "http://api.openweathermap.org/data/2.5/forecast/daily?    q=94043&mode=json&units=metric&cnt=7&APPID=" + appId;
            OpenWeatherRequest request = new OpenWeatherRequest();
            request.response = this;
            request.execute(url);

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

    @Override
    public void requestDone(String jsonResponse) {
        forecastJsonStr = jsonResponse;
        Log.d(Constants.LOG_TAG,forecastJsonStr);
    }
}

//==== Interface used to get result from AsyncTask in MainActivity
public interface ForecastRequest {
    void requestDone(String output);
}

//==== The AsyncTask that make a request to OpenWeather API
public class OpenWeatherRequest extends AsyncTask<String, Integer, String> {
    // These two need to be declared outside the try/catch
    // so that they can be closed in the finally block.
    HttpURLConnection urlConnection = null;
    BufferedReader reader = null;
    // Will contain the raw JSON response as a string.
    String forecastJsonStr = null;
    public ForecastRequest response = null;

    protected void onPreExecute() {
        Log.d(Constants.LOG_TAG,"Fetching data...");
    }

    protected String doInBackground(String... urls) {
        try {
            URL url = new URL(urls[0]);

            // Create the request to OpenWeatherMap, and open the connection
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.connect();

            // Read the input stream into a String
            InputStream inputStream =     urlConnection.getInputStream();
            StringBuffer buffer = new StringBuffer();
            if (inputStream == null) {
                throw new Exception("No data");
            }
            reader = new BufferedReader(new InputStreamReader(inputStream));

            String line;
            while ((line = reader.readLine()) != null) {
                buffer.append(line + "\n");
            }

            if (buffer.length() == 0) {
                return null;
            }
            forecastJsonStr = buffer.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return forecastJsonStr;
    }

    protected void onPostExecute(String result) {
        response.requestDone(result);
    }
}

//==== The fragment
public class MainActivityFragment extends Fragment {

    private ArrayAdapter<String> mForecastAdapter;
    ArrayList<String> weekForecast;
    private ListView mListView;


    public MainActivityFragment() {

    }

    public void onViewCreated(View view, Bundle savedInstanceState) {


    }

    public View onCreateView(LayoutInflater inflater, ViewGroup     container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main,     container, false);

        //=== Add fake data
        weekForecast = new ArrayList<>(Arrays.asList(
                "Today - Sunny - 88/63",
                "Tomorrow - Foggy - 70/40",
                "Weds - Cloudy - 72/63",
                "Thurs - Asteroids - 75/65",
                "Fri - Heavy Rain - 65/56",
                "Sat - HELP TRAPPED IN WEATHERSTATION - 60/51",
                "Sun - Sunny - 80/68")
        );

        mForecastAdapter = new ArrayAdapter<>(
                // The current context (this fragment parent activity)
                getActivity(),
                // ID of list item layout
                R.layout.list_item_forecast,
                // ID of the textview to populate
                R.id.list_item_forecast_textview,
                // Data
                weekForecast);

        mListView =     (ListView)rootView.findViewById(R.id.listview_forecast);
        mListView.setAdapter(mForecastAdapter);

        return rootView;
    }
}

共有1个答案

汝楷
2023-03-14

我只是在手机上试了一下,没有在Android Studio模拟器上试过,消息就消失了。所以问题来自模拟器,而不是我的代码。

 类似资料:
  • 当我在emulator上启动应用程序时,我发现以下消息 我看到有很多类似的问题,但每个问题都有不同的解决方案。Tnx很多! 日志猫 搜索ictionary.java WordActivity.java 字典提供程序。Java语言 公共类DictionaryProvider扩展ContentProvider{String TAG="DictionaryProvider";

  • 我对Android非常陌生,在我的应用程序中,当我点击添加在碎片类上的按钮时,我在活动上添加了碎片,我在我的日志猫上得到警告,如下所示- 跳过91帧!应用程序可能在其主线程上做了太多工作。 请帮帮我我该怎么解决这个?

  • 我有以下错误 关于它的研究。。。确保使用Runnable尽可能多地在新线程中启动所有内容。但不断地出错。我几乎注释了我所有的代码,但在我开始一个新活动时仍然得到了它。然后,我对第一次活动中的这个mapfragment进行了注释,错误就消失了。因此,错误是由以下代码引起的: 我从Android文档的谷歌地图API中得到了这个。。。有点奇怪,它没有得到优化。如何确保错误消失?我可以延迟mapFragm

  • 我是Android SDK/API环境的新手。这是我第一次试着画一张图/图表。我尝试使用3个不同的免费库在模拟器上运行不同类型的示例代码,但布局屏幕上没有显示任何内容。logcat将重复以下消息: 当我运行与一个许可库的评估副本相关的示例代码时,问题并没有持续存在,并且图表工作了。

  • 您好,我正在开发一个android应用程序,当我尝试从我的应用程序发送电子邮件时,我会遇到这个错误。基于此链接,我在后台发送邮件而不使用意图 我的程序: 当我直接指定收件人的电子邮件地址时,应用程序工作正常。当我将其指定为存储收件人电子邮件地址的字符串数组时,问题就来了。 Logcat显示: 跳过222帧!应用程序可能在其主线程上做了太多工作。 谁能告诉我到底是什么问题?

  • 我正在开发一个日历应用程序,并使用textview作为日历单元格,当我启动应用程序后检查logcat时,我发现来自Choreographer的消息“跳过了76帧!应用程序可能在其主线程上做了太多工作”。我知道我正在创建很多文本视图(120),但如何在不影响应用程序性能的情况下构建日历呢?是否有其他方法可以构建支持活动的日历?